1. 问题由来
因需要开发了一款基于CGAL的处理三维几何的子程序(简称子程序B),该子程序B被主程序A调用,我们知道CGAL还可以调用Qt5库用于图形显示,因此为了实现这一目标,设想利用Cmake制作一个可供主程序A调用的dll,此dll可调用CGAL,而CGAL又可调用Qt5。
程序A、B、CGAL、Qt5之间的流程:
主程序A->子程序B->CGAL->Qt5
Cmake实现子程序B封装成B.dll后:
主程序A->B.dll (CGAL)->Qt5
2. 解决过程
2.1 生成B.dll
建立子程序B的目录树,如下:
lib
├─CmakeLists.txt
├─build
├─include
└─src
将头文件和源文件分别拷贝到include和src文件夹下,编辑CmakeLists.txt文件,其内容如下:
project(my_dll)
cmake_minimum_required(VERSION 3.20)
cmake_policy(SET CMP0020 NEW)
set(CMAKE_CXX_STANDARD 17)
SET(INCDIR ./include/creat_point.h)
SET(SRCDIR ./src/creat_point.cpp ./src/dataIn.cpp ./src/lcc.cpp ./src/nef.cpp ./src/obb.cpp ./src/particle_basic.cpp ./src/poly.cpp
./src/poly_ib.cpp ./src/rpp.cpp ./src/seeds.cpp ./src/type.cpp)
SET(LIBSRC ${SRCDIR} ${INCDIR})
SET(LIBRARY_OUTPUT_PATH ./libdll)
find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5)
if(CGAL_Qt5_FOUND)
add_definitions(-DCGAL_USE_BASIC_VIEWER -DQT_NO_KEYWORDS)
endif()
find_package(CGAL QUIET COMPONENTS Core )
if ( CGAL_FOUND )
include( ${CGAL_USE_FILE} )
ADD_LIBRARY(creat_point SHARED ${LIBSRC})
if(CGAL_Qt5_FOUND)
target_link_libraries(creat_point PUBLIC CGAL::CGAL_Qt5)
endif()
SET_TARGET_PROPERTIES(
creat_point
PROPERTIES
LINKER_LANGUAGE C
RUNTIME_OUTPUT_DIRECTORY ${LIBRARY_OUTPUT_PATH}
LIBRARY_OUTPUT_DIRECTORY ${LIBRARY_OUTPUT_PATH}
OUTPUT_NAME "creat_point"
PREFIX ""
)
else()
message(STATUS "This program requires the CGAL library, and will not be compiled.")
endif()
2.2 调用B.dll
建立主程序A的目录树,如下:
test
├─CmakeLists.txt
├─test.cpp #测试程序
├─build
└─poly #数据文件
主程序A(test.cpp)如下:
#include "../lib/include/creat_point.h"
int main()
{
creat_point();
return 0;
}
test/CmakeLists.txt内容为:
project( test )
cmake_minimum_required(VERSION 3.20)
set(CMAKE_CXX_STANDARD 17)
set(TEST_LIB_DIR ../lib/build/libdll/Debug)
set(TEST_INCLUDE_DIR ../lib)
set(TEST_DLL_DIR ../lib/build/libdll/Debug)
find_package(CGAL REQUIRED OPTIONAL_COMPONENTS Qt5)
if(CGAL_Qt5_FOUND)
add_definitions(-DCGAL_USE_BASIC_VIEWER -DQT_NO_KEYWORDS)
endif()
find_package(CGAL QUIET COMPONENTS Core)
if ( CGAL_FOUND )
include( ${CGAL_USE_FILE} )
include( CGAL_CreateSingleSourceCGALProgram )
create_single_source_cgal_program( "test.cpp" )
if(CGAL_Qt5_FOUND)
target_link_libraries(
${PROJECT_NAME}
PUBLIC
"${TEST_LIB_DIR}/creat_point.lib"
"CGAL::CGAL_Qt5"
)
endif()
target_include_directories(
${PROJECT_NAME}
PUBLIC
"${TEST_INCLUDE_DIR}/include"
)
else()
message(STATUS "This program requires the CGAL library, and will not be compiled.")
endif()