在Visual Studio中编译libredwg和libdxfrw之前,需要先搭建好开发环境。我推荐使用VS 2019或更高版本,因为这两个库对C++17特性的依赖较多。首先从官网下载安装Visual Studio Community版,勾选"使用C++的桌面开发"工作负载,特别注意要包含CMake工具和Git支持组件。
安装完成后,打开VS的"开发者命令提示符",运行git --version和cmake --version确认工具链正常。这里有个小技巧:建议将CMake升级到3.20以上版本,可以避免后续很多兼容性问题。我实测发现libdxfrw在CMake 3.18下会出现奇怪的链接错误,升级后问题就消失了。
libredwg的源码托管在GNU Savannah上,使用Git克隆时要注意:
bash复制git clone https://git.savannah.gnu.org/git/libredwg.git
cd libredwg
git submodule update --init
这个库依赖jsmn这个轻量级JSON解析器,官方文档可能没说清楚的是:必须把jsmn目录放在libredwg/src目录下,而不是根目录。我当初在这里卡了半天,直到看了CMakeLists.txt才恍然大悟。
libdxfrw的获取相对简单:
bash复制git clone https://github.com/LibreCAD/libdxfrw.git
但要注意它的依赖项比较特殊——需要先安装zlib开发库。在Windows下推荐使用vcpkg管理:
bash复制vcpkg install zlib:x64-windows
有个坑我踩过:如果系统里装了多个版本的zlib,编译时会报LNK2005重复符号错误。解决方法是在CMake配置时显式指定zlib路径:
cmake复制-DZLIB_ROOT=D:/vcpkg/installed/x64-windows
在VS中打开libredwg项目时,不要直接点击"打开CMake项目",而是应该:
bash复制mkdir build
cd build
cmake .. -G "Visual Studio 16 2019" -A x64
这里有个关键点:必须添加-DWITH_EXAMPLES=OFF参数,否则会编译失败。因为示例程序依赖的某些头文件在Windows下路径处理有问题。我在GitHub上看到不少issue都是关于这个的。
libdxfrw的CMake配置更简单些,但推荐加上这些参数:
cmake复制cmake .. -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=ON -DCMAKE_INSTALL_PREFIX=../output
特别说明下BUILD_SHARED_LIBS选项:如果打算动态链接就设为ON,静态链接则OFF。我建议先用动态库调试,发布时再考虑静态链接。
编译libredwg时最常见的错误是:
code复制warning C4819: 该文件包含不能在当前代码页(936)中表示的字符
这不是简单的警告,会导致后续链接失败。解决方法分三步:
有个更彻底的方法:在CMakeLists.txt开头添加:
cmake复制add_compile_options(/utf-8)
这样可以一劳永逸解决所有文件的编码问题。
libdxfrw可能会报zlib的链接错误,典型症状是:
code复制LNK2019: 无法解析的外部符号 _inflateInit2_
这说明CMake没正确找到zlib库。我的解决方案是:
cmake复制-DCMAKE_TOOLCHAIN_FILE=[vcpkg根目录]/scripts/buildsystems/vcpkg.cmake
建议在CMake配置时指定统一的输出目录:
cmake复制set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/bin)
set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
set(CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR}/lib)
这样编译生成的.dll/.lib/.exe文件都会归类存放,方便后续使用。我见过不少开发者抱怨找不到生成的文件,就是因为输出目录太分散。
编译完成后,可以用这个代码片段测试libredwg是否工作正常:
cpp复制#include <dwg.h>
#include <stdio.h>
int main() {
Dwg_Data dwg;
if (dwg_read_file("test.dwg", &dwg)) {
printf("版本: %s\n", dwg.header.version);
dwg_free(&dwg);
return 0;
}
return 1;
}
记得把test.dwg放在可执行文件同级目录,并配置好库路径。如果能看到输出版本号,说明编译完全成功。