从 32 位 Xcode 项目引用 64 位静态库

发布于 2024-12-18 11:02:27 字数 179 浏览 1 评论 0原文

我正在尝试在 Xcode 中使用 C++ 中的 echoprint API 构建 OpenFrameworks 项目。 OpenFrameworks 需要在 i386 中构建,但 echoprint 在 x86_64 中构建。

是否可以从 32 位项目引用 64 位静态库?如果是这样,我该如何在 Xcode 4 中执行此操作?

I'm trying to build an OpenFrameworks project while using the echoprint API in C++ in Xcode. OpenFrameworks requires to be built in i386, but echoprint builds in x86_64.

Is it possible to reference a 64-bit static library from a 32-bit project? If so, how do I do this within Xcode 4?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

说好的呢 2024-12-25 11:02:27

这可能是不可能的(至少在 Linux 上不可能),因为指令 & x86(32 位)和 x86-64(64 位)上的寄存器集不同。

有些人设法在 Linux 上从 64 位代码调用 32 位库(例如 ndiswrapper ...)。细节应该很丑。

我建议将 32 位软件设置为与 64 位软件不同的进程,并在它们之间使用一些 IPC 机制。

It is probably not possible (at least not on Linux), because the instruction & register sets are different on x86 (32 bits) and x86-64 (64 bits).

Some people managed to make dirty tricks to call 32 bits libraries from 64 bits code on Linux (.e.g. ndiswrapper ...). Details should be very ugly.

I would suggest to make your 32 bit software a different process from the 64 bits one, and use some IPC machinery between them.

此刻的回忆 2024-12-25 11:02:27

通过将 -arch i386 添加到 Makefile 开头的 OPTFLAGS 并在线添加 $(CXXFLAGS),我能够在 Mac OS X 和库上将 echoprint-codegen 构建为 32 位可执行文件24. 我使用 MacPorts,并且确实需要确保使用通用变体构建 taglib。

我写了一个补丁:

diff --git a/src/Makefile b/src/Makefile
index 630efb4..1c9b821 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -2,8 +2,8 @@ UNAME := $(shell uname -s)
 CXX=g++
 CC=gcc
 #OPTFLAGS=-g -O0
-OPTFLAGS=-O3 -DBOOST_UBLAS_NDEBUG -DNDEBUG
-CXXFLAGS=-Wall -I/usr/local/include/boost-1_35 `taglib-config --cflags` -fPIC $(OPTFLAGS)
+OPTFLAGS=-O3 -DBOOST_UBLAS_NDEBUG -DNDEBUG -arch i386
+CXXFLAGS=-Wall -I/usr/local/include/boost-1_35 `taglib-config --cflags` -fPIC $(OPTFLAGS)
 CFLAGS=-Wall -fPIC $(OPTFLAGS)
 LDFLAGS=`taglib-config --libs` -lz -lpthread $(OPTFLAGS)

@@ -21,7 +21,7 @@ MODULES = $(MODULES_LIB) Metadata.o
 all: libcodegen echoprint-codegen

 libcodegen: $(MODULES_LIB)
-   $(CXX) -shared -fPIC -o libcodegen.so $(MODULES_LIB) -lz
+   $(CXX) $(CXXFLAGS) -shared -fPIC -o libcodegen.so $(MODULES_LIB) -lz
 ifeq ($(UNAME),Darwin)
    libtool -dynamic -flat_namespace -install_name libcodegen.4.1.1.dylib -lSystem -compatibility_version 4.1 -macosx_version_min 10.6 \
         -current_version 4.1.1 -o libcodegen.4.1.1.dylib -undefined suppress \

我将其作为要点存储在此处

I was able to build echoprint-codegen as a 32-bit executable on Mac OS X and library by adding -arch i386 to the OPTFLAGS at the beginning of the Makefile and adding a $(CXXFLAGS) on line 24. I use MacPorts and I did need to make sure to build taglib with the universal variant.

I wrote a patch:

diff --git a/src/Makefile b/src/Makefile
index 630efb4..1c9b821 100644
--- a/src/Makefile
+++ b/src/Makefile
@@ -2,8 +2,8 @@ UNAME := $(shell uname -s)
 CXX=g++
 CC=gcc
 #OPTFLAGS=-g -O0
-OPTFLAGS=-O3 -DBOOST_UBLAS_NDEBUG -DNDEBUG
-CXXFLAGS=-Wall -I/usr/local/include/boost-1_35 `taglib-config --cflags` -fPIC $(OPTFLAGS)
+OPTFLAGS=-O3 -DBOOST_UBLAS_NDEBUG -DNDEBUG -arch i386
+CXXFLAGS=-Wall -I/usr/local/include/boost-1_35 `taglib-config --cflags` -fPIC $(OPTFLAGS)
 CFLAGS=-Wall -fPIC $(OPTFLAGS)
 LDFLAGS=`taglib-config --libs` -lz -lpthread $(OPTFLAGS)

@@ -21,7 +21,7 @@ MODULES = $(MODULES_LIB) Metadata.o
 all: libcodegen echoprint-codegen

 libcodegen: $(MODULES_LIB)
-   $(CXX) -shared -fPIC -o libcodegen.so $(MODULES_LIB) -lz
+   $(CXX) $(CXXFLAGS) -shared -fPIC -o libcodegen.so $(MODULES_LIB) -lz
 ifeq ($(UNAME),Darwin)
    libtool -dynamic -flat_namespace -install_name libcodegen.4.1.1.dylib -lSystem -compatibility_version 4.1 -macosx_version_min 10.6 \
         -current_version 4.1.1 -o libcodegen.4.1.1.dylib -undefined suppress \

which I've stored as a gist here.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文