C++: CMake/Visual Studio не может связать внешние библиотеки при вызове из заголовка, но работает при вызове из .cppC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 C++: CMake/Visual Studio не может связать внешние библиотеки при вызове из заголовка, но работает при вызове из .cpp

Сообщение Anonymous »

Я пытаюсь написать библиотеку, которая будет работать как интерфейс между E57Format и остальными нашими проектами, и включить ее в качестве подкаталога в мой основной CMake. Когда я вызываю функции формата E57Format из связанного файла .cpp этого подкаталога, все работает нормально. Но как только я вызываю функцию из файла .hpp в подкаталоге, компоновщик не может ее найти. Конечно, я хочу создать функцию-шаблон, поэтому мне нужны эти вызовы в моем .hpp. Как ни странно, это работает, когда я создаю свою библиотеку, используя STATIC вместо SHARED, и пока это работает, мне хотелось бы оставаться максимально универсальным, а также понимать ошибку. Вот мои фрагменты кода:
Основной CMake:

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

cmake_minimum_required (VERSION 3.12)

# Enable Hot Reload for MSVC compilers if supported.
if (POLICY CMP0141)
cmake_policy(SET CMP0141 NEW)
set(CMAKE_MSVC_DEBUG_INFORMATION_FORMAT "$")
endif()

project ("e57test" LANGUAGES CXX )

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

add_executable (${PROJECT_NAME}
"src/main.cpp"
)

# Find Boost
find_package(Boost REQUIRED COMPONENTS thread)
target_link_libraries(${PROJECT_NAME} PRIVATE ${Boost_LIBRARIES})

# VTK
find_package(VTK REQUIRED)
include("${VTK_USE_FILE}")
include_directories(${VTK_INCLUDE_DIRS})
target_link_libraries(${PROJECT_NAME} PRIVATE ${VTK_LIBRARIES})

# PCL
find_package(Eigen3 CONFIG REQUIRED)
find_package(PCL CONFIG REQUIRED COMPONENTS io octree visualization filters segmentation registration)
include_directories( ${PCL_INCLUDE_DIRS})
add_definitions(${PCL_DEFINITIONS})
target_include_directories(${PROJECT_NAME} PRIVATE ${PCL_INCLUDE_DIRS} ${VTK_INCLUDE_DIRS})
target_compile_definitions(${PROJECT_NAME} PRIVATE VTK_LEGACY_SILENT -DNO_EXPLICIT_INSTANTIATIONS)
target_compile_options(${PROJECT_NAME} PRIVATE ${PCL_COMPILE_OPTIONS})
target_link_libraries(${PROJECT_NAME} PRIVATE Eigen3::Eigen ${VTK_DEFINITIONS} ${PCL_LIBRARIES})

# E57Wrapper
add_subdirectory("e57wrapper")
get_target_property(LIBB_INCLUDES e57wrapper INCLUDE_DIRECTORIES)
target_link_libraries(${PROJECT_NAME} PRIVATE e57wrapper)

target_include_directories(${PROJECT_NAME} PRIVATE ${CMAKE_CURRENT_SOURCE_DIR})
target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_17)
с main.cpp, просто вызывающим мою функцию в подкаталоге («e57wrapper»):

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

#include "e57wrapper/E57Wrapper.hpp"

int main(int argc, char** argv)
{
foo();
}
а вот CMake моего подкаталога:

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

cmake_minimum_required (VERSION 3.12)

if(MSVC)
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS TRUE)
endif()

project (e57wrapper LANGUAGES CXX )

add_library(e57wrapper SHARED
"E57Wrapper.cpp"
)

# PCL
find_package(Eigen3 CONFIG REQUIRED)
find_package(PCL CONFIG REQUIRED)
include_directories( ${PCL_INCLUDE_DIRS})
add_definitions(${PCL_DEFINITIONS})
target_include_directories(${PROJECT_NAME} PUBLIC ${PCL_INCLUDE_DIRS} ${VTK_INCLUDE_DIRS})
target_compile_definitions(${PROJECT_NAME} PRIVATE VTK_LEGACY_SILENT -DNO_EXPLICIT_INSTANTIATIONS)
target_compile_options(${PROJECT_NAME} PRIVATE ${PCL_COMPILE_OPTIONS})
target_link_libraries(${PROJECT_NAME} PRIVATE Eigen3::Eigen ${VTK_DEFINITIONS} ${PCL_LIBRARIES})

# e57Format
find_package( E57Format CONFIG REQUIRED)
target_link_libraries(${PROJECT_NAME} PRIVATE E57Format)

target_include_directories(${PROJECT_NAME} PUBLIC ${CMAKE_CURRENT_SOURCE_DIR})

# Output .dll to built .exe location
set_target_properties(e57wrapper PROPERTIES
RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}"
)
с помощью E57Wrapper.cpp:

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

#include "E57Wrapper.hpp"

//other functions
и E57Wrapper.hpp:

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

#pragma once

#include 
#include 
#include 

//other functions

inline void foo()
{
e57::RigidBodyTransform a = e57::RigidBodyTransform(); // Fails to link
std::cout 

Подробнее здесь: [url]https://stackoverflow.com/questions/78494558/c-cmake-visual-studio-failing-to-link-external-libraries-when-called-from-h[/url]
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

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

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