融合 API 和 CMake 构建
Fuse API and CMake Build
我最近 re-opened 几年前参与的一个项目。我写了一个小 python 脚本来构建项目。我想将其移植到 CMake。
我遇到的问题是脚本在 linux 上使用 pkg-config
来查找保险丝 headers 和库。我在将其移植到 CMake 时遇到问题。
这是当前的 python 脚本
import subprocess, sys, os, shutil
def call( command ):
c = subprocess.Popen( command.split(), stdout=subprocess.PIPE )
c.wait()
return c.stdout.read()
class GCC:
args = None
def __init__( self, initial_args ):
self.args = initial_args
def addPKG( self, package ):
self.args.extend( package )
def addFile( self, name ):
self.args.append( name )
def compile( self, out_name ):
self.args.extend(["-o", out_name])
print " ".join( self.args )
gcc = subprocess.Popen( self.args )
return gcc.wait() == 0
if __name__ == '__main__':
cflags = call("pkg-config fuse --libs --cflags").split()
print cflags
gcc = GCC(["gcc","-g","-Wall","-pg"])
gcc.addFile("argsparse.c")
gcc.addFile("hidden.c")
#gcc.addFile("fs.c")
gcc.addFile("initialization.c")
gcc.addFile("resolve.c")
gcc.addFile("utilities.c")
gcc.addFile("winhomefs0.4.c")
gcc.addPKG(cflags)
gcc.addFile("-lulockmgr")
if gcc.compile("winhomefs") and 'install' in sys.argv:
if os.getuid() == 0:
shutil.copy("winhomefs", "/usr/local/bin/winhomefs")
这是我当前的 CMakeLists.txt 文件。
cmake_minimum_required (VERSION 2.8.11)
project (HomeFS)
set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}
"${CMAKE_SOURCE_DIR}/CMakeModules/")
find_package(FUSE REQUIRED)
add_library(argsparse argsparse.c)
add_library(hidden hidden.c)
add_library(initialization initialization.c)
add_library(resolve resolve.c)
add_library(utilities utilities.c)
add_executable(homefs winhomefs0.4.c)
我遇到的问题是查找保险丝部分。我尝试了几种不同的排列组合,包括以下...
https://github.com/tarruda/encfs/blob/master/CMakeModules/FindFUSE.cmake
https://github.com/Pronghorn/pronghorn/blob/master/FindFUSE.cmake
似乎都不起作用我得到:
...argsparse.c:21:22: fatal error: fuse_opt.h: No such file or directory
#include <fuse_opt.h>
^
compilation terminated.
python 脚本有效,但这表明 cmake 的配置方式存在问题。
作为参考,上面的 pkg-config 行在我的系统上输出以下内容。
-D_FILE_OFFSET_BITS=64 -I/usr/include/fuse -lfuse -pthread
感谢您的帮助!
根据弗雷泽的反馈,我更新了两件事。
我的 CMakeLists.txt 现在看起来像:
cmake_minimum_required (VERSION 2.8.11)
project (HomeFS)
set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}
"${CMAKE_SOURCE_DIR}/CMakeModules/")
find_package(FUSE REQUIRED)
add_executable(homefs
argsparse.c
hidden.c
initialization.c
resolve.c
utilities.c
winhomefs0.4.c)
set(CMAKE_C_FLAGS "-D_FILE_OFFSET_BITS=64 -lulockmgr")
target_include_directories(homefs PRIVATE ${FUSE_INCLUDE_DIR})
target_link_libraries(homefs ${FUSE_LIBRARIES})
并且所有对 <fuse.h>
和 <fuse_opt.h>
的引用都已更新为 <fuse/fuse.h>
等等。我还必须添加标志 -D_FILE_OFFSET_BITS=64
,它现在可以干净地编译。
但是我仍然收到链接器错误。
winhomefs0.4.c:(.text+0x10b2): undefined reference to `ulockmgr_op'
collect2: error: ld returned 1 exit status
我尝试将库 -lulockmgr
添加到 c 标志中,但这不起作用。
Google 在这方面我还不是朋友 对 ulockmgr 的引用很少 我需要实现 FindULOCKMGR CMake 模块,还是需要在其他地方添加该行?
好的,经过反复试验+逻辑思考,我解决了我需要将 -lulockmgr
字符串从 CFLAGS 移动到 target_link_libraries
行的问题。
您的 CMakeLists.txt 中可能只是漏接了几个电话。
行 find_package(FUSE REQUIRED)
将尝试找到 FUSE header 和 FUSE 库的路径。两个 FindFUSE.cmake 文件顶部的注释块提供了每个设置的变量的详细信息。以 encfs 为例。它会将 FUSE_FOUND
设置为 true 或 false,如果未找到 FUSE,则允许您退出脚本并显示有用的错误消息。
变量FUSE_INCLUDE_DIR
将设置为包含 FUSE header 的文件夹的绝对路径。 FUSE_LIBRARIES
将设置为 FUSE 库的绝对路径列表。
您的CMakeLists.txt目前缺少的是使用这些变量。
您可以在调用 target_include_directories
and target_link_libraries
时使用它们 - 例如
target_include_directories(homefs PRIVATE ${FUSE_INCLUDE_DIR})
target_link_libraries(homefs ${FUSE_LIBRARIES})
另一个问题是您使用五个 add_library
调用创建了五个单独的库,但随后没有使用它们。至少我希望看到这些也通过 target_link_libraries
调用链接到 exe。
我不太了解 Python 原始脚本在做什么,但我认为更可能的解决方案是这些都应该只是 exe 的一部分:
<strike>
add_library(argsparse argsparse.c)
add_library(隐藏 hidden.c)
add_library(初始化initialization.c)
add_library(解析resolve.c)
add_library(实用程序 utilities.c)</strike>
add_executable(homefs
argsparse.c
hidden.c
initialization.c
resolve.c
utilities.c
winhomefs0.4.c)
我最近 re-opened 几年前参与的一个项目。我写了一个小 python 脚本来构建项目。我想将其移植到 CMake。
我遇到的问题是脚本在 linux 上使用 pkg-config
来查找保险丝 headers 和库。我在将其移植到 CMake 时遇到问题。
这是当前的 python 脚本
import subprocess, sys, os, shutil
def call( command ):
c = subprocess.Popen( command.split(), stdout=subprocess.PIPE )
c.wait()
return c.stdout.read()
class GCC:
args = None
def __init__( self, initial_args ):
self.args = initial_args
def addPKG( self, package ):
self.args.extend( package )
def addFile( self, name ):
self.args.append( name )
def compile( self, out_name ):
self.args.extend(["-o", out_name])
print " ".join( self.args )
gcc = subprocess.Popen( self.args )
return gcc.wait() == 0
if __name__ == '__main__':
cflags = call("pkg-config fuse --libs --cflags").split()
print cflags
gcc = GCC(["gcc","-g","-Wall","-pg"])
gcc.addFile("argsparse.c")
gcc.addFile("hidden.c")
#gcc.addFile("fs.c")
gcc.addFile("initialization.c")
gcc.addFile("resolve.c")
gcc.addFile("utilities.c")
gcc.addFile("winhomefs0.4.c")
gcc.addPKG(cflags)
gcc.addFile("-lulockmgr")
if gcc.compile("winhomefs") and 'install' in sys.argv:
if os.getuid() == 0:
shutil.copy("winhomefs", "/usr/local/bin/winhomefs")
这是我当前的 CMakeLists.txt 文件。
cmake_minimum_required (VERSION 2.8.11)
project (HomeFS)
set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}
"${CMAKE_SOURCE_DIR}/CMakeModules/")
find_package(FUSE REQUIRED)
add_library(argsparse argsparse.c)
add_library(hidden hidden.c)
add_library(initialization initialization.c)
add_library(resolve resolve.c)
add_library(utilities utilities.c)
add_executable(homefs winhomefs0.4.c)
我遇到的问题是查找保险丝部分。我尝试了几种不同的排列组合,包括以下...
https://github.com/tarruda/encfs/blob/master/CMakeModules/FindFUSE.cmake https://github.com/Pronghorn/pronghorn/blob/master/FindFUSE.cmake
似乎都不起作用我得到:
...argsparse.c:21:22: fatal error: fuse_opt.h: No such file or directory
#include <fuse_opt.h>
^
compilation terminated.
python 脚本有效,但这表明 cmake 的配置方式存在问题。
作为参考,上面的 pkg-config 行在我的系统上输出以下内容。
-D_FILE_OFFSET_BITS=64 -I/usr/include/fuse -lfuse -pthread
感谢您的帮助!
根据弗雷泽的反馈,我更新了两件事。 我的 CMakeLists.txt 现在看起来像:
cmake_minimum_required (VERSION 2.8.11)
project (HomeFS)
set (CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH}
"${CMAKE_SOURCE_DIR}/CMakeModules/")
find_package(FUSE REQUIRED)
add_executable(homefs
argsparse.c
hidden.c
initialization.c
resolve.c
utilities.c
winhomefs0.4.c)
set(CMAKE_C_FLAGS "-D_FILE_OFFSET_BITS=64 -lulockmgr")
target_include_directories(homefs PRIVATE ${FUSE_INCLUDE_DIR})
target_link_libraries(homefs ${FUSE_LIBRARIES})
并且所有对 <fuse.h>
和 <fuse_opt.h>
的引用都已更新为 <fuse/fuse.h>
等等。我还必须添加标志 -D_FILE_OFFSET_BITS=64
,它现在可以干净地编译。
但是我仍然收到链接器错误。
winhomefs0.4.c:(.text+0x10b2): undefined reference to `ulockmgr_op'
collect2: error: ld returned 1 exit status
我尝试将库 -lulockmgr
添加到 c 标志中,但这不起作用。
Google 在这方面我还不是朋友 对 ulockmgr 的引用很少 我需要实现 FindULOCKMGR CMake 模块,还是需要在其他地方添加该行?
好的,经过反复试验+逻辑思考,我解决了我需要将 -lulockmgr
字符串从 CFLAGS 移动到 target_link_libraries
行的问题。
您的 CMakeLists.txt 中可能只是漏接了几个电话。
行 find_package(FUSE REQUIRED)
将尝试找到 FUSE header 和 FUSE 库的路径。两个 FindFUSE.cmake 文件顶部的注释块提供了每个设置的变量的详细信息。以 encfs 为例。它会将 FUSE_FOUND
设置为 true 或 false,如果未找到 FUSE,则允许您退出脚本并显示有用的错误消息。
变量FUSE_INCLUDE_DIR
将设置为包含 FUSE header 的文件夹的绝对路径。 FUSE_LIBRARIES
将设置为 FUSE 库的绝对路径列表。
您的CMakeLists.txt目前缺少的是使用这些变量。
您可以在调用 target_include_directories
and target_link_libraries
时使用它们 - 例如
target_include_directories(homefs PRIVATE ${FUSE_INCLUDE_DIR})
target_link_libraries(homefs ${FUSE_LIBRARIES})
另一个问题是您使用五个 add_library
调用创建了五个单独的库,但随后没有使用它们。至少我希望看到这些也通过 target_link_libraries
调用链接到 exe。
我不太了解 Python 原始脚本在做什么,但我认为更可能的解决方案是这些都应该只是 exe 的一部分:
<strike>
add_library(argsparse argsparse.c)
add_library(隐藏 hidden.c)
add_library(初始化initialization.c)
add_library(解析resolve.c)
add_library(实用程序 utilities.c)</strike>
add_executable(homefs
argsparse.c
hidden.c
initialization.c
resolve.c
utilities.c
winhomefs0.4.c)