首页 > 解决方案 > 使用 cmake 在 macOS 上共享库的链接器问题

问题描述

我有一个创建共享库的 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++macoscmakelinkershared-libraries

解决方案


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

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

推荐阅读