我有一个具有以下结构的CMake项目
root
|- common
|- Bitmap.h
|- Bitmap.cpp
|- BytesUtils.h
|- BytesUtils.cpp
|- encoding
|- jni
|- impl.cpp
|- main.cpp
该项目将创建两个工件:一个使用main.cpp的可执行文件,以及一个使用jni /中要由JNI加载的源代码的共享库。它们都依赖于通用和编码的源文件。
这是我的根目录/CMakeLists.txt
file(GLOB_RECURSE COMMON_SOURCE
"common/*.h"
"common/*.cpp"
)
file(GLOB_RECURSE ENCODING_SOURCE
"encoding/*.h"
"encoding/*.cpp"
)
add_library(common STATIC ${COMMON_SOURCE})
add_library(encoding STATIC ${ENCODING_SOURCE})
add_executable(main main.cpp)
target_link_libraries(main common)
target_link_libraries(main encoding)
add_subdirectory(jni)
这是jni / CMakeLists.txt
set(JAVA_HOME "/usr/lib/jvm/jdk1.8.0_221")
#set(JAVA_HOME "/usr/lib/jvm/java-8-openjdk-amd64/")
include_directories(${JAVA_HOME}/include)
include_directories(${JAVA_HOME}/include/linux)
file(GLOB_RECURSE JNI_SOURCE
"*.h"
"*.cpp"
)
add_library(lqf SHARED ${JNI_SOURCE})
target_link_libraries(lqf common)
target_link_libraries(lqf encoding)
当我使用JNI加载库时,出现以下错误:
/usr/lib/jvm/jdk1.8.0_221/bin/java: symbol lookup error: /home/harper/git/lqf/lqf-cpp/cmake-build-debug/lib/liblqf.so: undefined symbol: _ZN6common6BitmapC1EPmj
使用nm
查看生成的代码,我发现common / Bitmap.cpp中的所有函数都标记为未定义符号
U _ZN6common6Bitmap10appendBitsEhj
U _ZN6common6Bitmap11moveForwardEj
U _ZN6common6BitmapC1EPmj
但是正确包含了common /下其他源代码的功能
0000000000002894 T _ZN6common10BytesUtils19readIntLittleEndianEPhPj
00000000000028d0 T _ZN6common10BytesUtils35readIntLittleEndianPaddedOnBitWidthEPhPjh
00000000000029d3 T _ZN6common10BytesUtils18readUnsignedVarIntEPhPj
我唯一看到的区别是Bitmap是一个类,而BytesUtils是一个函数集合。
Bitmap.h
#include <cstdint>
namespace common {
class Bitmap {
public:
Bitmap(uint64_t *data, uint32_t offset);
void appendWord(uint64_t *word, uint32_t count);
void appendBits(uint8_t bit, uint32_t rep);
void moveForward(uint32_t count);
};
}
Bitmap.cpp:
#include "Bitmap.h"
common::Bitmap::Bitmap(uint64_t *data, uint32_t offset) {...}
void common::Bitmap::appendBits(uint8_t bit, uint32_t repetition) {...}
void common::Bitmap::appendWord(uint64_t *word, uint32_t count) {...}
void common::Bitmap::moveForward(uint32_t count) {...}
那么构建共享库以便包含这些符号的正确方法是什么?
更新@ 2019年9月24日21:32
这是由静态库之间的依赖性引起的。编码库使用公共库,但是我无法在它们之间添加target_link_libraries。添加target_link_libraries(encoding, common)
后,符号表将固定。
答案 0 :(得分:1)
这是由静态库之间的依赖性引起的。编码库使用公共库,但是我无法在它们之间添加target_link_libraries。添加target_link_libraries(encoding common)
后,符号表将固定。