У меня есть общая библиотека (которая в настоящее время компилируется, загружается и запускается) 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>)
Сбой с «неопределенной ссылкой на 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 более сложный, так как он содержит в основном код, автоматически сгенерированный глоток.
Это работает для меня с простым 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() {
}
Немного документация.
Других решений пока нет …