C++ CMake:静态库未与第二个项目正确链接

C++ CMake:静态库未与第二个项目正确链接,c++,cmake,C++,Cmake,让我先说一句,我对CMake很陌生,所以如果我只是误解了什么,请告诉我 首先,我编译一个静态库,它充当外部程序(Paraview)的包装器。我用于创建此库的CmakeList文件如下所示: cmake_minimum_required(VERSION 3.3) project(POP) set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY [LIBRARY HOME]/lib/) set(ParaView_DIR [PARAVIEW HOME]/ParaView-v5.4.

让我先说一句,我对CMake很陌生,所以如果我只是误解了什么,请告诉我

首先,我编译一个静态库,它充当外部程序(Paraview)的包装器。我用于创建此库的CmakeList文件如下所示:

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++项目,只调用这个库的主要功能< /p>
#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中函数的未定义引用错误,在libPOP.a中我引用了VTK/Paraview数据结构和函数。这些不是在上面的玩具代码中直接定义的,但是它们应该在库中定义,对吗?如果这些结构都是在编译初始库时定义的,为什么在外部调用该库时不定义它们


谢谢。

这些没有在上面的玩具代码中直接定义,但是它们应该在库中定义,对吗?
-不,您的
POP
库没有定义
ParaView
中的符号。因此,当链接到您的库时,您仍然需要链接到
ParaView
@Tsyvarev,是否有任何方法可以使库完全独立?出于多种原因,直接链接Paraview和我的最终代码是非常混乱的。如果“自包含”的意思是您的库将从Paraview定义符号,那么您需要一起编译这些库的代码。或者构建库的静态变体,并将它们合并到单个静态库中(google)。如果“自包含”的意思是链接库时会自动执行与“Paraview”的链接,那么您需要创建共享库而不是静态库。好的,这实际上非常有用!