Рассмотрим следующие файлы: < /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)
Я чувствую, что делаю что -то не так с этой настройкой Cmake, все еще стараясь понять то, что требуется для какого шага и т. Д. Так что любые предложения апрецированы!
Подробнее здесь: https://stackoverflow.com/questions/794 ... ic-library