C ++ Неопределенная ссылка из -за стирания типа в динамической библиотеке [дублировать]C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 C ++ Неопределенная ссылка из -за стирания типа в динамической библиотеке [дублировать]

Сообщение Anonymous »

Я нашел странную «неопределенную ссылку» ошибку, которую, как подойдет, вызвана стиранием типа.
Рассмотрим следующие файлы: < /p>

Код: Выделить всё

// /src/include/test.hpp
#ifndef DFAE125A_36A7_45E0_8694_B744EB39931B
#define DFAE125A_36A7_45E0_8694_B744EB39931B

#include 

namespace test
{
class A {
};

template
class B
{

public:
B(std::vector args);
virtual T apply(T val);
};

class C {
public:
C(std::vector args);
};
}

#endif /* DFAE125A_36A7_45E0_8694_B744EB39931B */

< /code>
// /src/lib/test.cpp

#include "../include/test.hpp"

#include 

namespace test
{
template
B::B(std::vector args)
{}
template
T B::apply(T v) { return v; }

C::C(std::vector args)
{}
}

< /code>
// /src/main/main.cpp
#include "../include/test.hpp"

#include 
#include 

int main(const int argc, const char* argv[])
{
std::vector v;
test::B b(v); // undefined reference error
test::C b(v); // no problems
return 0;
}

< /code>
cmake files: < /p>
#./cMakeLists.txt
cmake_minimum_required(VERSION 3.31)

set(PROGRAM_NAME test_project)
set(LIB_NAME test_project_lib)

set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)

project(${PROGRAM_NAME} LANGUAGES CXX VERSION 1.0.0)

file(GLOB_RECURSE PROGRAM_SOURCES ${CMAKE_SOURCE_DIR}/src/main *.c *.cpp *.h *.hpp)
list(FILTER PROGRAM_SOURCES INCLUDE REGEX "^${CMAKE_CURRENT_SOURCE_DIR}/src/main/.*$")

add_subdirectory(${CMAKE_SOURCE_DIR}/src)

add_executable(${PROGRAM_NAME} ${PROGRAM_SOURCES})
target_link_libraries(${PROGRAM_NAME} PRIVATE ${LIB_NAME})

< /code>
#./src/cMakeLists.txt
cmake_minimum_required(VERSION 3.31)

file(GLOB_RECURSE LIB_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/lib *.c *.cpp *.h *.hpp)
list(FILTER LIB_SOURCES INCLUDE REGEX "^${CMAKE_CURRENT_SOURCE_DIR}/lib/.*$")

add_library(${LIB_NAME} SHARED ${LIB_SOURCES})
target_include_directories(${LIB_NAME} PUBLIC ${CMAKE_SOURCE_DIR}/src/inlcude)
Насколько я мог выяснить, ошибка неопределенная ссылка вызвана потому, что тип шаблона стирается, когда (динамическая) библиотека построена (как класс Без шаблона работает нормально). Возможным решением было бы добавить что-то вроде Template класса B; к файлу заголовка, за исключением того, что он будет жаловаться на то, что поплавок как шаблон-параметры «нестандартные».
Я чувствую, что делаю что -то не так с этой настройкой Cmake, все еще стараясь понять то, что требуется для какого шага и т. Д. Так что любые предложения апрецированы!

Подробнее здесь: https://stackoverflow.com/questions/794 ... ic-library
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»