Недавно я недавно открыл проект, над которым я работал пару лет назад. Я написал небольшой скрипт python для создания проекта. Я хотел бы передать это вместо CMake.Fuse API и CMake Build
Проблема, с которой я столкнулась, заключается в том, что сценарий использует pkg-config
для Linux, чтобы найти заголовки и библиотеки плавких предохранителей. У меня возникли проблемы с переносом на 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.
Сценарий питон работает, однако, который предполагает, что есть что-то неправильно с настройкой 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
Я попытался добавить LIB -lulockmgr
к С флагами, но это не работает. Google не был моим другом, поэтому очень мало ссылок на ulockmgr мне нужно реализовать модуль FindULOCKMGR CMake, или мне нужно добавить строку в другом месте?
Ok после нескольких проб и ошибок + логического мышления я решил вопрос мне нужно, чтобы переместить -lulockmgr
строки из CFLAGS в target_link_libraries
линии.
Спасибо за обратной связи, теперь я могу скомпилировать код, но я все еще получаю ошибку компоновщика. Я обновил свой вопрос с более подробной информацией за ваши отзывы. –
Ничего, я решил. Я уточню свой вопрос выше. –