CMake "OBJECT" 库:clang 未正确链接
CMake "OBJECT" library: clang not linking properly
我有一个共享库(当前编译、加载和运行)mylib.so
。在这个库中,我想使用一个新函数(在另一个外部库中注册)。签名是bool my_function(const QVariant *, PyObject **)
.
这个新函数在一个单独的 .cpp 文件中定义,该文件被编译为一个对象,然后链接到 mylib.so
。
所以我用我的自定义函数创建了一个新的 OBJECT
ADD_LIBRARY(helper_lib OBJECT helper_lib.cpp)
并在构建我的库时包含它
ADD_LIBRARY(mylib SHARED source.cpp $<TARGET_OBJECTS:helper_lib>)
它失败了 "undefined reference to `my_function'"
我可以看到
- 生成
helper_lib.o
文件
nm helper_lib.o
显示
0000000000000000 T _Z11my_functionPK8QVariantPP7_object
nm mylib.o
显示
U my_function
将helper_lib.o
传递给clang++:
clang++ -fPIC [...] -o my_lib.so mylib.o helper_lib.o [...]
我很难看出哪里出了问题。我可以想象 mylib.o
中有问题,它显示了一个无法与 helper_lib.o
符号名称匹配的未损坏的符号名称,但我也可能完全走错了路。
helper_lib.h
void my_function();
helper_lib.cpp
#include "helper_lib.h"
void my_function()
{
return;
}
source.cpp 比较复杂,因为它主要包含 sip.
自动生成的代码
它对我来说很简单 source.cpp。所以一定是在包含过程中出现了问题,您可以尝试将 #include "helper_lib.h
移动到 source.cpp.
的顶部
要验证这与您的工具链无关,您可以从干净的构建目录中尝试以下项目:
CMakeLists.txt:
cmake_minimum_required(VERSION 3.3)
project(dummy)
ADD_LIBRARY(helper_lib OBJECT helper_lib.cpp)
ADD_LIBRARY(mylib SHARED source.cpp $<TARGET_OBJECTS:helper_lib>)
source.cpp:
#include "helper_lib.h"
void dummy() {
my_function();
}
helper_lib.h:
#pragma once
void my_function();
helper_lib.cpp:
#include "helper_lib.h"
void my_function() {
}
我有一个共享库(当前编译、加载和运行)mylib.so
。在这个库中,我想使用一个新函数(在另一个外部库中注册)。签名是bool my_function(const QVariant *, PyObject **)
.
这个新函数在一个单独的 .cpp 文件中定义,该文件被编译为一个对象,然后链接到 mylib.so
。
所以我用我的自定义函数创建了一个新的 OBJECT
ADD_LIBRARY(helper_lib OBJECT helper_lib.cpp)
并在构建我的库时包含它
ADD_LIBRARY(mylib SHARED source.cpp $<TARGET_OBJECTS:helper_lib>)
它失败了 "undefined reference to `my_function'"
我可以看到
- 生成
helper_lib.o
文件 nm helper_lib.o
显示0000000000000000 T _Z11my_functionPK8QVariantPP7_object
nm mylib.o
显示U my_function
将
helper_lib.o
传递给clang++:clang++ -fPIC [...] -o my_lib.so mylib.o helper_lib.o [...]
我很难看出哪里出了问题。我可以想象 mylib.o
中有问题,它显示了一个无法与 helper_lib.o
符号名称匹配的未损坏的符号名称,但我也可能完全走错了路。
helper_lib.h
void my_function();
helper_lib.cpp
#include "helper_lib.h"
void my_function()
{
return;
}
source.cpp 比较复杂,因为它主要包含 sip.
自动生成的代码它对我来说很简单 source.cpp。所以一定是在包含过程中出现了问题,您可以尝试将 #include "helper_lib.h
移动到 source.cpp.
要验证这与您的工具链无关,您可以从干净的构建目录中尝试以下项目:
CMakeLists.txt:
cmake_minimum_required(VERSION 3.3)
project(dummy)
ADD_LIBRARY(helper_lib OBJECT helper_lib.cpp)
ADD_LIBRARY(mylib SHARED source.cpp $<TARGET_OBJECTS:helper_lib>)
source.cpp:
#include "helper_lib.h"
void dummy() {
my_function();
}
helper_lib.h:
#pragma once
void my_function();
helper_lib.cpp:
#include "helper_lib.h"
void my_function() {
}