使用cmake在macOS上共享库的链接器问题

时间:2019-02-16 14:41:12

标签: c++ macos cmake linker shared-libraries

我有一个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上成功构建,但不能同时在两个平台上构建。

2 个答案:

答案 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
)

这可以防止使用变量时出错。