CMake & quot; ОБЪЕКТ & quot; библиотека: clang неправильно связывает

У меня есть общая библиотека (которая в настоящее время компилируется, загружается и запускается) 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 более сложный, так как он содержит в основном код, автоматически сгенерированный глоток.

3

Решение

Это работает для меня с простым 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() {
}

Немного документация.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]