Link with Boost (Homebrew) Mac c++
Link with Boost (Homebrew) Mac c++
您好,我正在尝试与 boost 链接以使用线程库,但似乎无法构建它。
我用HomeBrew(mac软件包安装程序)安装了boost,它位于/usr/local/Cellar/boost/1.50.0
目录中。
我的主文件现在非常简单...
#include <iostream>
#include <boost/thread.hpp>
我的制作文件是这样的:
CC = g++
BASE_FLAGS = -m32 -wAll
# INCLUDE BASE DIRECTORY AND BOOST DIRECTORY FOR HEADERS
LDFLAGS = -I/usr/local/Cellar/boost/1.50.0/include -I/opt/local/include
# INCLUDE BASE DIRECTORY AND BOOST DIRECTORY FOR LIB FILES
LLIBFLAGS = -L/usr/local/Cellar/boost/1.50.0/
# SPECIFIY LINK OPTIONS
LINKFLAGS = -l boost_thread-mt -lboost_system
# FINAL FLAGS -- TO BE USED THROUGHOUT
FLAGS = $(BASE_FLAGS) $(LLIBFLAGS) $(LDFLAGS) $(LINKFLAGS)
# NOTE FOR BOOST -- YOU ONLY NEED TO INCLUDE THE PATH BECAUSE IT ONLY INSTALLS HEADER FILES
main: main.cpp
$(CC) $(FLAGS) -o main.out main.cpp
当我运行它时,我得到了一个boost_system找不到的库。如果我取出boost_system,则会收到如下所示的错误:
ld: warning: ignoring file /usr/local/lib/libboost_thread-mt.dylib, file was built for unsupported file format ( 0xcf 0xfa 0xed 0xfe 0x 7 0x 0 0x 0 0x 1 0x 3 0x 0 0x 0 0x 0 0x 6 0x 0 0x 0 0x 0 ) which is not the architecture being linked (i386): /usr/local/lib/libboost_thread-mt.dylib
Undefined symbols for architecture i386:
"boost::system::system_category()", referenced from:
__static_initialization_and_destruction_0(int, int)in ccKwJWzr.o
"boost::system::generic_category()", referenced from:
__static_initialization_and_destruction_0(int, int)in ccKwJWzr.o
ld: symbol(s) not found for architecture i386
collect2: ld returned 1 exit status
make: *** [main] Error 1
如果您刚刚使用了没有选项的brew install boost
,这将构建一个 64 位二进制文件 - 静态和动态。
上面代码的罪魁祸首是使用-m32
选项,删除它,你应该没问题。这意味着您正在尝试将 32 位版本与 64 位库链接。
Boost 库以符号方式链接到 /usr/local/Cellar/
- (/usr/local/lib
和 /usr/local/include
中的实际二进制文件和标头。您的 PATH 应包含这些内容,因此无需在生成文件中指定这些内容。
请注意,brew(通过扩展 gcc)通常默认构建 64 位二进制文件,从您的错误输出中构建了 Boost 库。(您可以使用这些工具检查库的体系结构otool
、file
或lipo
)
正如 Jesse Good 所指出的,您的 -mt 后缀有问题。对于所有再次遇到这种情况的人(即使在 Windows 上):
事实证明,-mt后缀(代表多线程支持)并未用于Linux boost安装,而是用于Mac和其他安装。Linux 上的 Boost 仍然支持多线程,它只是一个命名约定。另请参阅 https://stackoverflow.com/a/2310892。
这就是为什么你必须在Mac和Windows的链接选项中添加-mt后缀到所有boost库中,而不是在Linux上。如果你与Linux共同开发人员一起使用CMake(就像我一样),你可以修改CMakeLists.txt如下所示:
if(APPLE OR WIN32)
target_link_libraries([other libs..] boost_thread-mt boost_system-mt)
else()
target_link_libraries([other libs..] boost_thread boost_system)
endif()
- 在没有Xcode的情况下在Mac捆绑包中嵌入框架
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 如何使用CLion在Mac上创建一个新的.txt文件
- 如何使用Clang/GCC在Mac上为C/C++设置VSCode
- 在 Mac 上使用 CMAKE 将 FFTW 和 FFTWPP 链接到项目中时未定义的符号
- 有人安装"IITB Simplecpp in mac"吗?
- libprotobuf 检查在 Mac OS 上执行程序时失败
- 如何在 Mac 上使用 c++17 并行标准库算法?
- 在 Mac 上的 python 上提升
- 我可以在 iOS 或 mac 应用程序中使用C++代码吗?
- 如何在 Mac 上正确编译C++,当它在 Linux 上编译没有问题时?
- C++读取用户输入而不按回车键(Mac OS X),与Turbo Pascal中的读取键相同
- 如何在 MAC OS c/c++ 中阻止 USB 存储设备
- 编译在我的 Mac 上工作,但在集群 (Linux) 上不起作用
- 在装有 CLion 的 Mac 上使用 C++ 连接到 MySQL 数据库时出现问题
- 动态获取 esp32 的 mac 地址并在以太网库中使用它.
- GDB 断点在 Mac 上是不准确的
- 各种版本的 Mac OSX 向后兼容性如何?(Xcode C++
- 无法识别 Mac c++ 文件系统库
- 为什么 SDL 在 Mac 上比 Linux 慢得多?