.dylib是OSX上的动态库扩展,但是当我不能/不应该使用传统的unix .so共享对象时,我从来都不清楚.
我有些问题:
我有一个用于Linux的Makefile,我将其移植到达尔文.makefile接受一堆.o文件并将它们链接到一个.so共享对象中.好吧,所以我想(我错了吗?)达尔文最好的模拟是dylib.所以我将-shared标志更改为-dynamiclib.
现在我连接到dylib的代码依赖于许多外部库.当我尝试构建dylib时,我得到错误,说有未定义的引用.但是Linux Makefile没有在创建.so文件的构建步骤中指定任何-lwhatever或-L/path/whatever选项.嗯?这是因为当您创建ELF .so文件时,默认情况下它会保留未解析的外部引用,然后在加载共享库时递归加载您正在加载的共享库所依赖的共享库?如果共享库依赖于.a或.o文件,您是否必须将它们静态链接到共享库中,否则您无法在运行时链接?除非引用也是可动态加载的库,否则如何在运行时加载的库中使用未定义的引用?
无论如何,如果我指定
-undefined suppress -flat_namespace
Run Code Online (Sandbox Code Playgroud)
在创建共享库时,它不需要我添加-l和-L选项.但我仍然不明白这最终会如何发挥作用.
我正在研究一个C++框架,当我在使用Clang的OSX上编译它时会出现一些问题.
首先,我正在使用其他一些库,例如openssl,而clang抱怨我在构建库时没有解决某些符号.它们不应该是:这些库将与最终的二进制文件链接,它不应该发生在中介上.
然后,还有一些方法和变量应该在"客户端"二进制文件中实现...使用GCC,没有问题,但Clang也抱怨这些符号在编译期间无法解决.
怎么会 ?我该怎么办 ?
这是我的CMakeLists.txt,以防有用:
cmake_minimum_required(VERSION 2.8)
project(crails_project)
set(CMAKE_CXX_FLAGS "-std=c++0x -Wall -Wno-deprecated-declarations -pedantic -DASYNC_SERVER -DSERVER_DEBUG -DUSE_MONGODB_SESSION_STORE")
find_package(cppnetlib REQUIRED)
include_directories(include /usr/local/include ${CPPNETLIB_INCLUDE_DIRS} .)
file(GLOB crails_core
src/*.cpp)
file(GLOB crails_sql
src/sql/*.cpp)
file(GLOB crails_mongodb
src/mongodb/*.cpp)
add_library(crails-core SHARED ${crails_core})
add_library(crails-sql SHARED ${crails_sql})
add_library(crails-mongodb SHARED ${crails_mongodb})
Run Code Online (Sandbox Code Playgroud)
这是崩溃的命令:
/usr/bin/c++ -std=c++0x -Wall -Wno-deprecated-declarations -pedantic -DASYNC_SERVER -DSERVER_DEBUG -DUSE_MONGODB_SESSION_STORE -dynamiclib -Wl,-headerpad_max_install_names -o libcrails-core.dylib -install_name /Users/michael/Personal/crails/build/libcrails-core.dylib CMakeFiles/crails-core.dir/src/assets.cpp.o CMakeFiles/crails-core.dir/src/cgi2params.cpp.o CMakeFiles/crails-core.dir/src/cipher.cpp.o [...]
Run Code Online (Sandbox Code Playgroud)
以下是我得到的两种错误:
架构x86_64的未定义符号:
"_BIO_ctrl", referenced from:
Cipher::encode_base64(unsigned char*, unsigned int) const in cipher.cpp.o
Run Code Online (Sandbox Code Playgroud)
第二个:
NOTE: a missing vtable usually means …Run Code Online (Sandbox Code Playgroud)