C++ 使用cmake的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

我有一个cmake项目,它创建了一个共享库,该库又引用了其他库:openssl、zlib、libevent和libevhtp。我的项目在linux上编译/链接良好(它创建了共享库,以及链接到我的库的可执行文件(testcases))

但是,在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
包含所有外部引用的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上构建库,但如果它们总是链接在一起,那么我想这将是一条可行的道路。