C++ 使用cmake的macOS上共享库的链接器问题
我有一个cmake项目,它创建了一个共享库,该库又引用了其他库:openssl、zlib、libevent和libevhtp。我的项目在linux上编译/链接良好(它创建了共享库,以及链接到我的库的可执行文件(testcases)) 但是,在macOS上,当库被链接时,我会得到未定义的引用:C++ 使用cmake的macOS上共享库的链接器问题,c++,macos,cmake,linker,shared-libraries,C++,Macos,Cmake,Linker,Shared Libraries,我有一个cmake项目,它创建了一个共享库,该库又引用了其他库:openssl、zlib、libevent和libevhtp。我的项目在linux上编译/链接良好(它创建了共享库,以及链接到我的库的可执行文件(testcases)) 但是,在macOS上,当库被链接时,我会得到未定义的引用: [ 54%] Linking CXX shared library libmylib.dylib Undefined symbols for architecture x86_64: "_RAND_by
[ 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
包含所有外部引用的LIBS)它将成功构建共享库,我可以使用它/链接到它,一切正常。
但是,我不能保留此选项,因为在linux上,我无法将我的库链接到libevhtp
,因为此库未使用-fPIC
编译
所以问题是,在macOS上创建的库总是链接到外部库是正常的吗,或者如何避免这种情况?目前,我可以在linux或macOS上成功构建,但不能同时在这两种平台上构建。动态库是链接的,因此它们需要与其依赖项链接。如果linux和mac上需要不同的标志,只需向变量添加条件:
if(LINUX)
set(EXTERNAL_LIBS ...)
endif ()
if (APPLE)
set(EXTERNAL_LIBS ...)
endif()
可以使用生成器表达式而不是变量:
target_link_libraries(mylib PUBLIC
$<$<PLATFORM_ID:Darwin>:libs_only_on_osx>
$<$<PLATFORM_ID:Linux>:libs_only_on_linux>
other_libs
)
target\u link\u库(mylib PUBLIC)
$
$
其他自由裁量权
)
这可以防止使用变量时出错。好的,我考虑过添加特定于平台的选项,但我不确定这是否是正确的方法。我不太熟悉在mac上构建库,但如果它们总是链接在一起,那么我想这将是一条可行的道路。