CMake:静态库无法正确链接到第二个项目

时间:2018-07-18 16:20:02

标签: c++ cmake

首先让我说我对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数据结构和函数。这些不是在上面的玩具代码中直接定义的,但是它们应该在库中定义,对吗?如果在编译初始库时这些结构都已定义,为什么在我从外部调用该库时未定义它们?

谢谢。

0 个答案:

没有答案