首先让我说我对CMake还是陌生的,因此,请让我知道我是否只是在误解这里的内容。
首先,我正在编译一个静态库,该库充当外部程序(Paraview)的包装。我用来创建该库的CMakeLists文件如下:
cmake_minimum_required(VERSION 3.3)
project(POP)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY [LIBRARY HOME]/lib/)
set(ParaView_DIR [PARAVIEW HOME]/ParaView-v5.4.1/)
find_package(ParaView REQUIRED COMPONENTS vtkPVPythonCatalyst)
include("${PARAVIEW_USE_FILE}")
if(NOT PARAVIEW_USE_MPI)
message(SEND_ERROR "ParaView must be built with MPI enabled")
endif()
set(HEADER_FILES ${CMAKE_CURRENT_SOURCE_DIR}/include/pop_API.h ${CMAKE_CURRENT_SOURCE_DIR}/include/pop_API_vars.h ${CMAKE_CURRENT_SOURCE_DIR}/include/pop_Structures.h ${CMAKE_CURRENT_SOURCE_DIR}/include/wrapper_pop_API.h)
add_library(POP STATIC src/pop_API.cpp src/wrapper_pop_API.cpp src/pop_Adaptor.cpp ${HEADER_FILES})
target_include_directories(POP PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/include)
target_link_libraries(POP LINK_PUBLIC vtkPVPythonCatalyst)
include(vtkModuleMacros)
include(vtkMPI)
vtk_mpi_link(POP)
此链接链接到我需要的特定Paraview模块中,以及为此所需的一些VTK数据结构。
此CMake文件运行得很好,我可以毫无问题地编译库。如果将Main函数添加到C ++代码中并将其编译为可执行文件,则也不会出现问题。所以这里的所有似乎都很好。
现在,我最终希望由第二段代码调用此静态库。为了对此进行测试,我编写了一个玩具C ++项目,该项目仅调用该库的主要功能
#include "pop_Structures.h"
#include "pop_API.h"
int main()
{
PopGrid* grid;
PopSolution* solution;
a = 1;
b = 2;
int x = POP_INITIALIZE(a, b);
int y = COPROCESS(PopGrid, PopSolution, a, b, a, b);
int z = POP_FINALIZE();
}
包含的头文件仅定义PopSolution和PopGrid结构,以及所调用的三个函数的原型。我使用看起来像
的CMakeLists文件为该程序创建可执行文件。cmake_minimum_required(VERSION 3.3)
project(CPP_Test)
find_package(MPI REQUIRED)
include_directories(${MPI_CXX_INCLUDE_PATH})
set(HEADER_FILES [LIBRARY HOME]/include/pop_API.h [LIBRARY HOME]/include/pop_Structures.h)
ADD_EXECUTABLE(CPP_TEST CPP_Test.cpp ${HEADER_FILES})
target_include_directories(CPP_TEST PUBLIC [LIBRARY HOME]/include)
target_link_libraries(CPP_TEST[LIBRARY HOME]/lib/libPOP.a)
此CMake也可以很好地运行,但是当我对其进行编译时,我得到许多未定义的引用错误,这些错误指向libPOP.a中的函数,其中我指的是VTK / Paraview数据结构和函数。这些不是在上面的玩具代码中直接定义的,但是它们应该在库中定义,对吗?如果在编译初始库时这些结构都已定义,为什么在我从外部调用该库时未定义它们?
谢谢。