如何构建运行OpenSubdiv教程示例 解决编译链接报错问题
错误原因
这是标准的链接阶段缺失依赖库报错:编译时g++已经成功找到OpenSubdiv的头文件完成了语法检查,但链接时没有指定要链接的OpenSubdiv实现库,ld找不到TopologyDescriptor构造函数对应的二进制实现,最终抛出undefined reference错误。
快速修复:直接用g++命令编译
你执行make install之后,OpenSubdiv默认将头文件安装到/usr/local/include,动态库安装到/usr/local/lib,编译时手动指定头文件路径、库路径和需要链接的库即可:
- 先执行
ls /usr/local/lib/libosdCPU*确认库文件存在,正常会输出类似libosdCPU.so.3.4.4的结果 - 把原编译命令替换为以下内容:
g++ opensubd_minimal_example.cpp -o opensubd_minimal_example -I/usr/local/include -L/usr/local/lib -losdCPU -lglfw -lGL -lX11 -lpthread -ldl
- 如果运行编译出的程序时提示找不到libosdCPU.so,先执行一次
sudo ldconfig刷新系统动态库缓存即可。
注意:你贴的测试代码里
g_nverts/g_nfaces/g_vertsperface/g_vertIndices四个变量未定义,测试时需要先补全,最小测试用例可以在main函数前加以下代码:const int g_nverts = 4; const int g_nfaces = 1; const int g_vertsperface[1] = {4}; const int g_vertIndices[4] = {0,1,2,3};
推荐方案:使用CMake管理编译配置
长期开发不建议手动写g++编译参数,用CMake可以自动查找依赖、处理链接关系,不用手动记路径和库名:
- 在代码文件同级目录新建名为
CMakeLists.txt的配置文件,写入以下内容:
cmake_minimum_required(VERSION 3.10) project(opensubd_test) find_package(OpenSubdiv REQUIRED) find_package(glfw3 REQUIRED) add_executable(opensubd_minimal_example opensubd_minimal_example.cpp) target_link_libraries(opensubd_minimal_example PRIVATE OpenSubdiv::osdCPU glfw )
- 依次执行以下命令完成编译:
mkdir build cd build cmake .. make -j$(nproc)
编译完成后直接运行./opensubd_minimal_example即可。
补充说明
你之前安装的doxygen是文档生成工具,因为编译OpenSubdiv时已经指定了NO_DOC=1,这个依赖完全可以不装,不影响库的功能。你编译时关闭了TBB、CUDA、OpenCL、PTEX等所有可选依赖,所以只需要链接OpenSubdiv的核心CPU库osdCPU即可,不需要额外链接其他OpenSubdiv相关组件。
内容的提问来源于stack exchange,提问作者GeneralPancake
相关产品推荐
相关产品推荐

