Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ CMake无法使用相对文件路径找到静态库_C++_Linker_Cmake_Allegro - Fatal编程技术网

C++ CMake无法使用相对文件路径找到静态库

C++ CMake无法使用相对文件路径找到静态库,c++,linker,cmake,allegro,C++,Linker,Cmake,Allegro,我很想玩弄这个库,但我似乎无法使我的测试项目正确链接。确切地说,我得到了找不到-l错误,其中是我使用目标链接库指定的文件。(详情见下文。) 作为记录,我对构建过程并不是很了解,我通常的做法是“点击一个按钮,希望弹出一个可执行文件,如果没有,就求助于试错。”我在这里发现了很多类似的问题,但问题或解决方案似乎与我所经历的不同。我希望得到一个明确的答案“这是你做错了什么,这是你应该做的” 也就是说,这是我的项目结构: /include /解放党 /src main.cpp CMakeLists.txt

我很想玩弄这个库,但我似乎无法使我的测试项目正确链接。确切地说,我得到了
找不到-l
错误,其中
是我使用
目标链接库指定的文件。(详情见下文。)

作为记录,我对构建过程并不是很了解,我通常的做法是“点击一个按钮,希望弹出一个可执行文件,如果没有,就求助于试错。”我在这里发现了很多类似的问题,但问题或解决方案似乎与我所经历的不同。我希望得到一个明确的答案“这是你做错了什么,这是你应该做的”

也就是说,这是我的项目结构:

/include
/解放党
/src
main.cpp
CMakeLists.txt
我从复制的include和lib目录,lib是所有.a文件所在的位置

我的CMakeLists.txt是这样说的:

cmake_最低要求(3.2版)
项目(AllegroTest)
设置(CMAKE_CXX_标志“${CMAKE_CXX_标志}-std=c++11-static libgcc-static libstdc++-fppermissive”)
添加定义(-DALLEGRO_静态链接)
文件(GLOB SOURCES src/*.cpp)
集合(源文件${SOURCES})
添加_可执行文件(AllegroTest${SOURCE_FILES})
包含目录(包含)
目标链接库(AllegroTest)
liballegro-5.0.10-static-mt.a
liballegro_acodec-5.0.10-static-mt.a
Liballero_audio-5.0.10-static-mt.a
libvorbisfile-1.3.2-static-mt.a
libvorbis-1.3.2-static-mt.a
liballegro_color-5.0.10-static-mt.a
Liballero_dialog-5.0.10-static-mt.a
liballegro_font-5.0.10-static-mt.a
liballegro_图像-5.0.10-static-mt.a
liballegro_memfile-5.0.10-static-mt.a
liballegro_physfs-5.0.10-static-mt.a
liballegro_原语-5.0.10-static-mt.a
liballegro_ttf-5.0.10-static-mt.a
libdumb-0.9.3-static-mt.a
libFLAC-1.2.1-static-mt.a
libfreetype-2.4.8-static-mt.a
libogg-1.2.1-static-mt.a
libzlib-1.2.5-static-mt.a
libopenal-1.14-static-mt.a
)
目标链接库(AllegroTest)
libgdiplus.a
libuuid.a
libkernel32.a
libwinmm.a
利普萨皮
libopengl32.a
libglu32.a
libuser32.a
libcomdlg32.a
libgdi32.a
libshell32.a
libole32.a
libadvapi32.a
libws2_32.a
libshlwapi.a
)
以下是我得到的错误:

c:/mingw/bin/./lib/gcc/mingw32/4.8.1/../../../../../../../../mingw32/bin/ld.exe:找不到-lallegro-5.0.10-static-mt
c:/mingw/bin/./lib/gcc/mingw32/4.8.1/../../../../../../../../../mingw32/bin/ld.exe:找不到-lallegro_acodec-5.0.10-static-mt
c:/mingw/bin/./lib/gcc/mingw32/4.8.1/../../../../../../../../mingw32/bin/ld.exe:找不到-lallegro_audio-5.0.10-static-mt
我尝试过以各种可以想象的方式指定路径,包括将其与
链接目录(lib)
的使用相结合,但似乎没有任何效果

唯一有效的方法是指定绝对路径(
C:/Users//lib/liballegro-5.0.10-static-mt.a
),但我觉得这远远不是理想的方法

我在这里犯了什么错误?建议用什么方法来修复它?

我建议使用绝对路径。我不知道为什么你认为这离理想很远;实现以下目标很简单:

目标链接库(AllegroTest)
${CMAKE_CURRENT_SOURCE_DIR}/lib/liballegro-5.0.10-static-mt.a
${CMAKE_CURRENT_SOURCE_DIR}/lib/liballegro_acodec-5.0.10-static-mt.a
等
)

我以前也做过类似的事情,我做的是这样的:

link_directories(lib)
target_link_libraries(my_target
    allegro-5.0.10-static-mt
    allegro_acodec-5.0.10-static-mt
    ...
)

请注意,没有前导的
lib
和尾随的
.a

我觉得使用绝对路径,项目将不再是自包含的,而是依赖于它的环境。我想
CMAKE\u CURRENT\u SOURCE\u DIR
是解决这个问题的一种方法,所以感谢您提到这一点。但是,真的没有办法使用真正相对的路径吗?在我看来应该有。老实说,我本来希望
link\u目录(lib)
能够解决这个问题,但是不鼓励使用
link\u目录
,即使是在实际应用中。通常会发现
CMAKE\u SOURCE\u DIR
CMAKE\u CURRENT\u SOURCE\u DIR
的实例,我认为这实际上是一种很好的做法。它使您无需检查文档中的命令,因为您不确定这些命令是否将路径视为相对于源根或构建根的路径。至少现在我理解,如果您认为必须从自己的计算机硬编码绝对路径,您会很不情愿——这确实应该不惜一切代价避免:)作为替代,您始终可以插入一个附加提示,该提示以硬编码的
${CMAKE\u CURRENT\u SOURCE\u DIR}/lib/…
作为提示,同时插入用户可自定义的第二个提示。我个人喜欢留出一个环境变量,允许用户为库注入一个优先于任何硬编码路径的自定义路径。另外,不要忘记清除cmake缓存。有时您需要手动执行此操作来解决配置问题。我不反对,因为这应该可以工作,但建议不要使用它,而是将完整路径传递到
target\u link\u库
。这对我不起作用。(很确定这也是我已经尝试过的事情之一。)@vvye它确实有效。但“该命令将仅应用于调用后创建的目标。”。因此,将
链接\u目录
放在
添加可执行文件
之前可以解决您的问题。