c++ - 使用 cmake 在 macOS 上共享库的链接器问题
问题描述
我有一个创建共享库的 cmake 项目,该库又引用其他库:openssl、zlib、libevent 和 libevhtp。我的项目在 linux 上编译/链接很好(它创建了共享库,以及链接到我的库(测试用例)的可执行文件)。
但是,在 macOS 上,链接库时我得到未定义的引用:
[ 54%] Linking CXX shared library libmylib.dylib
Undefined symbols for architecture x86_64:
"_RAND_bytes", referenced from:
mylib::randomStringHex(int) in util.cc.o
"_SSL_get_ex_data", referenced from:
(...more errors)
现在如果我添加这个:
target_link_libraries(mylib PUBLIC ${EXTERNAL_LIBS})
(EXTERNAL_LIBS
包含所有外部引用的库)它将成功构建共享库,我可以使用它/链接到它,一切正常。但是我不能保留这个选项,因为在 linux 上我不能将我的库链接到libevhtp
,因为这个库不是用-fPIC
.
所以问题是,在 macOS 上创建的库总是链接到外部库是否正常,或者如何避免这种情况?就目前而言,我可以在 linux 或 macOS 上成功构建,但不能同时在两个平台上构建。
解决方案
动态库是linked
,因此它们需要与其依赖项链接。如果您在 linux 和 mac 上需要不同的标志,只需将条件添加到您的变量:
if(LINUX)
set(EXTERNAL_LIBS ...)
endif ()
if (APPLE)
set(EXTERNAL_LIBS ...)
endif()
推荐阅读
- asp.net-mvc - 角度路由始终重定向到同一页面
- c++ - 使用 NupenGL 时找不到“网格”标识符
- python - Python的JPEG2000 API
- scala - Pyspark 抛出错误:py4j.Py4JException:方法 __getstate__([]) 不存在
- c++ - QT 从 QDataStream 读/写
- amazon-web-services - AWS Lambda async/await forEach(不是每个项目)
- php - 更新php中数组内对象属性的值
- sql - Pandas read_sql() 在使用 hive odbc 连接器时不喜欢 DISTINCT 关键字
- android - 无法从片段内部隐藏导航栏
- google-sheets - 在“Countifs”公式Google表格中使用“and”和“or”逻辑