【问题标题】:Linker issues with shared library on macOS using cmake使用 cmake 在 macOS 上共享库的链接器问题
【发布时间】:2019-02-16 14:41:12
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    动态库是linked,因此它们需要与其依赖项链接。如果您在 linux 和 mac 上需要不同的标志,只需在变量中添加条件:

    if(LINUX) 
        set(EXTERNAL_LIBS ...)
    endif ()
    if (APPLE)
        set(EXTERNAL_LIBS ...)
    endif()
    

    【讨论】:

    • 好的,我考虑过添加特定于平台的选项,但我不确定这是否是正确的方法。我对在 mac 上构建库不是很熟悉,但如果它们总是被链接,那么我想这就是要走的路。
    【解决方案2】:

    您可以使用生成器表达式代替变量:

    target_link_libraries(mylib PUBLIC
        $<$<PLATFORM_ID:Darwin>:libs_only_on_osx>
        $<$<PLATFORM_ID:Linux>:libs_only_on_linux>
        other_libs
    )
    

    这可以防止使用变量的错误。

    【讨论】:

      猜你喜欢
      • 2023-03-10
      • 2017-05-29
      • 1970-01-01
      • 2016-01-08
      • 2022-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-22
      相关资源
      最近更新 更多