我有一个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上成功构建,但不能同时在两个平台上构建。
答案 0 :(得分:1)
动态库是linked
,因此需要将它们与其依赖项链接在一起。如果您需要在Linux和Mac上使用不同的标志,只需向变量添加条件:
if(LINUX)
set(EXTERNAL_LIBS ...)
endif ()
if (APPLE)
set(EXTERNAL_LIBS ...)
endif()
答案 1 :(得分:1)
您可以使用生成器表达式代替变量:
target_link_libraries(mylib PUBLIC
$<$<PLATFORM_ID:Darwin>:libs_only_on_osx>
$<$<PLATFORM_ID:Linux>:libs_only_on_linux>
other_libs
)
这可以防止使用变量时出错。