CMake 并在错误的位置查找 libjawt.so 文件

CMake and make looking for libjawt.so file in the wrong place

我有一个 C++、Java 和 CMake 项目,但我目前无法编译它。我遇到以下错误。

make[2]: *** No rule to make target '/usr/lib/jvm/default/jre/lib/amd64/libjawt.so', needed by 'build/Ygor'.  Stop.

从我在网上读到的内容来看,这意味着编译器无法找到该文件,要么它在错误的地方查找,要么它不存在。果然放错地方了。在我的电脑上 libjawt.so 文件实际上位于 /usr/lib/jvm/default/lib/libjawt.so/usr/lib/jvm/default/.

中没有jre

我希望编译器能够准确定位它要查找的文件。自动或由我告诉它它在哪里。但是我不知道如何向编译器表达这一点。我试图将 include_directories("/usr/lib/jvm/default/lib") 添加到最上面的 CMakeLists.txt 文件,但这没有任何改变。我知道 add_libraryfind_library CMake 函数,但如果它们可以在这种情况下帮助我,我不知道如何使用它们来做到这一点。

这是完整的编译器输出。

Scanning dependencies of target CommandParser
[  7%] Building CXX object src/CMakeFiles/CommandParser.dir/CommandParser.cpp.o
[ 14%] Linking CXX static library libCommandParser.a
[ 14%] Built target CommandParser
Scanning dependencies of target Item
[ 21%] Building CXX object src/CMakeFiles/Item.dir/Item.cpp.o
[ 28%] Linking CXX static library libItem.a
[ 28%] Built target Item
Scanning dependencies of target Dependency
[ 35%] Building CXX object src/CMakeFiles/Dependency.dir/dependency.cpp.o
[ 42%] Linking CXX static library libDependency.a
[ 42%] Built target Dependency
Scanning dependencies of target Parser
[ 50%] Building CXX object src/CMakeFiles/Parser.dir/Parser.cpp.o
[ 57%] Linking CXX static library libParser.a
[ 57%] Built target Parser
Scanning dependencies of target Actor
[ 64%] Building CXX object src/CMakeFiles/Actor.dir/Actor.cpp.o
[ 71%] Linking CXX static library libActor.a
[ 71%] Built target Actor
Scanning dependencies of target Room
[ 78%] Building CXX object src/CMakeFiles/Room.dir/Room.cpp.o
[ 85%] Linking CXX static library libRoom.a
[ 85%] Built target Room
Scanning dependencies of target Ygor
[ 92%] Building CXX object CMakeFiles/Ygor.dir/src/main.cpp.o
make[2]: *** No rule to make target '/usr/lib/jvm/default/jre/lib/amd64/libjawt.so', needed by 'build/Ygor'.  Stop.
make[1]: *** [CMakeFiles/Makefile2:131: CMakeFiles/Ygor.dir/all] Error 2
make: *** [Makefile:104: all] Error 2

这里是最上面的 CMakeLists.txt 文件。

cmake_minimum_required (VERSION 2.6)
project (Ygor)
# Version Numbers
set (Ygor_VERSION_MAJOR 0)
set (Ygor_VERSION_MINOR 1)
set (Ygor_VERSION "${Ygor_VERSION_MAJOR}.${Ygor_VERSION_MINOR}")
# Output
set (EXECUTABLE_OUTPUT_PATH "${CMAKE_BINARY_DIR}/build")

# Include directories
include_directories ("${PROJECT_SOURCE_DIR}/src")
include_directories ("${PROJECT_SOURCE_DIR}/build")
include_directories ("${PROJECT_SOURCE_DIR}/build/include")
include_directories ("${PROJECT_SOURCE_DIR}/build/include/linux")
include_directories ("${PROJECT_SOURCE_DIR}/build/stanford-corenlp")
include_directories ("/usr/lib/jvm/default/lib")
add_subdirectory (src)
# Find the JNI package
find_package(JNI)
if (JNI_FOUND)
    include_directories("${JNI_INCLUDE_DIRS}")
endif()

add_executable (Ygor src/main.cpp)
target_link_libraries (Ygor Parser)
target_link_libraries (Ygor Dependency)
target_link_libraries (Ygor CommandParser)
target_link_libraries (Ygor Actor)
target_link_libraries (Ygor Item)
target_link_libraries (Ygor Room)
if (JNI_FOUND)
    target_link_libraries (Ygor ${JNI_LIBRARIES})
endif()

通过调用线路:

find_package(JNI)

CMake 提供 several JNI cache variables 允许您指定关联库的位置(如果未找到或找到的库不正确)。您可以从项目的命令行 运行 cmake 查看缓存变量列表:

cmake -LA

这在 CMake GUI 中也很容易查看。如果 JAVA_AWT_LIBRARY 变量的值不正确,您可以再次 运行 CMake,为该变量提供更新的值:

cmake -DJAVA_AWT_LIBRARY=/usr/lib/jvm/default/lib/libjawt.so ..