从0到1移动和设置osqp-eigen库和eigen

1 我现在电脑上把osqp-eigen安装在默认位置了,你能不能不安装,直接把电脑上拿到/home/ubuntu/Code_Study/osqp_study/osqp-eigen下,以后的find,就来这里找

你想把已经安装在默认位置的 osqp-eigen 库移到一个自定义位置,并确保后续的CMake在搜索库时可以找到它。以下是你可以按照的步骤:

  1. 拷贝相关文件:

    先确保你知道osqp-eigen的安装路径。如果你不确定,通常头文件可能被安装在 /usr/local/include 而库文件在 /usr/local/lib。但这取决于你的安装方式和设置。

    假设你知道了安装路径,使用cpmv命令将相关的头文件和库文件复制或移动到 /home/ubuntu/Code_Study/osqp_study/osqp-eigen

    mkdir -p /home/ubuntu/Code_Study/osqp_study/osqp-eigen/include
    mkdir -p /home/ubuntu/Code_Study/osqp_study/osqp-eigen/lib
    
    cp -r /path_to_default_location/include/osqp-eigen /home/ubuntu/Code_Study/osqp_study/osqp-eigen/include/
    cp -r /path_to_default_location/lib/libosqp-eigen* /home/ubuntu/Code_Study/osqp_study/osqp-eigen/lib/
    

    注意替换 /path_to_default_locationosqp-eigen 的默认安装路径。

  2. 更新CMake以查找库:

    在你的CMakeLists.txt文件中,你需要设置头文件和库文件的路径,以确保CMake能找到它们。

    list(APPEND CMAKE_PREFIX_PATH "/home/ubuntu/Code_Study/osqp_study/osqp-eigen")
    
    find_path(OSQP_EIGEN_INCLUDE_DIR NAMES osqp-eigen.hpp PATHS "${CMAKE_PREFIX_PATH}/include")
    find_library(OSQP_EIGEN_LIBRARY NAMES osqp-eigen PATHS "${CMAKE_PREFIX_PATH}/lib")
    
    include_directories(${OSQP_EIGEN_INCLUDE_DIR})
    link_directories(${CMAKE_PREFIX_PATH}/lib)
    

    在你需要链接osqp-eigen的目标之后,使用:

    target_link_libraries(your_target ${OSQP_EIGEN_LIBRARY})
    

    这里的 your_target 是你希望链接的目标名称。

  3. 编译与运行:

    当你运行CMake和你的构建工具时(如make),它现在应该在你指定的新位置查找 osqp-eigen

这是一个基本的指导,可能需要根据你的具体情况进行调整。

2 我现在电脑上把osqp-eigen安装在默认位置了,你能不能不安装,直接把电脑上拿到/home/ubuntu/Code_Study/osqp_study/osqp-eigen_smooth下,以后的find,就来这里找。你能蹦能通过命令找到osqp-eigen它的头文件和库文件,然后在去拷贝

当然可以。你可以使用find命令来在你的系统中查找osqp-eigen的头文件和库文件。然后使用cp命令拷贝到你指定的位置。

首先,查找头文件和库文件:

# 查找头文件
find /usr/local/include /usr/include -name "OsqpEigen*" 2>/dev/null

# 查找库文件
find /usr/local/lib /usr/lib -name "libOsqpEigen*" 2>/dev/null

假设你找到了头文件和库文件的路径,你可以使用以下命令拷贝它们:

# 创建目标目录
mkdir -p /home/ubuntu/Code_Study/osqp_study/osqp-eigen_smooth/include
mkdir -p /home/ubuntu/Code_Study/osqp_study/osqp-eigen_smooth/lib

# 拷贝头文件
cp -r /path_to_osqp-eigen_header/ /home/ubuntu/Code_Study/osqp_study/osqp-eigen_smooth/include/

# 拷贝库文件
cp /path_to_osqp-eigen_lib* /home/ubuntu/Code_Study/osqp_study/osqp-eigen_smooth/lib/

注意将/path_to_osqp-eigen_header//path_to_osqp-eigen_lib替换为你在上一步find命令中找到的实际路径。

然后,在你的CMakeLists.txt中,你可以像我之前提到的那样设置CMAKE_PREFIX_PATH来指定库的位置。

希望这可以帮到你!

3 OsqpEigen是不是依赖于Eigen3

cmake_minimum_required(VERSION 3.1)
set (CMAKE_CXX_STANDARD 11)
project(OsqpEigen-Example)
find_package(OsqpEigen)
find_package(Eigen3)
include_directories(SYSTEM ${
   EIGEN3_INCLUDE_DIR})
#MPCExample
add_executable(MPCExample src/MPCExample.cpp)
target_link_libraries(MPCExample OsqpEigen::OsqpEigen)    

是的,OsqpEigen是一个为OSQP(一种用于求解二次规划问题的求解器)提供C++接口的库,它依赖于Eigen3来进行线性代数操作。Eigen3是一个C++模板库,用于线性代数、矩阵和向量操作,以及相关的数学运算。

从你提供的CMakeLists.txt中可以明显看出,项目在查找和包含OsqpEigen的同时也查找和包含了Eigen3

在这一行:

include_directories(SYSTEM ${EIGEN3_INCLUDE_DIR})

它指示CMake包含Eigen3的头文件目录。

在这一行:

target_link_libraries(MPCExample OsqpEigen::OsqpEigen)

项目链接了OsqpEigen库。但请注意,因为Eigen3是一个头文件-only库,所以你并不需要在target_link_libraries中链接它。当你包含它的头文件时,它的所有功能就可用了。

总的来说,是的,OsqpEigen依赖于Eigen3。如果你在项目中使用OsqpEigen,你也需要确保Eigen3被正确地找到和包含。

4 find_package(Eigen3 REQUIRED),你能不能输出Eigen3的文件位置,然后把这个Eigen3全都复制到/home/ubuntu/Code_Study/osqp_study/下

当你在CMake中使用 find_package(Eigen3 REQUIRED),CMake会使用已配置的模块或配置文件来查找Eigen3。如果找到了,它会设置一些变量,其中最关键的是 EIGEN3_INCLUDE_DIR,这个变量通常指向Eigen3的头文件位置。

要在命令行中获取 EIGEN3_INCLUDE_DIR 的值,你可以创建一个简单的CMake脚本来输出这个信息。

  1. 创建一个CMakeLists.txt文件
cmake_minimum_required(VERSION 3.1)
project(FindEigen3)
find_package(Eigen3 REQUIRED)
message(STATUS "Eigen3 include directory is: ${EIGEN3_INCLUDE_DIR}")
  1. 在一个新目录中运行CMake
mkdir eigen_finder
cd eigen_finder
cmake path_to_the_above_CMakeLists.txt

确保替换 path_to_the_above_CMakeLists.txt 为你创建的CMakeLists.txt文件的路径。

  1. 查看CMake输出

在CMake的输出中,你应该能看到类似下面的行:

-- Eigen3 include directory is: /path/to/eigen3
  1. 复制Eigen3到目标位置

知道了Eigen3的头文件位置后,使用cp命令复制它:

cp -r /path/to/eigen3 /home/ubuntu/Code_Study/osqp_study/Eigen3

确保替换 /path/to/eigen3 为你从CMake输出中找到的实际路径。

现在,你应该在 /home/ubuntu/Code_Study/osqp_study/ 下有一个名为 Eigen3 的目录,其中包含所有Eigen3的头文件。

5 现在我把eigen3由/usr/local/include/eigen3,移动到了/home/ubuntu/Code_Study/osqp_study;然后OsqpEigen的头文件和库文件,分别在/home/ubuntu/Code_Study/osqp_study/osqp-eigen_smooth/include和/home/ubuntu/Code_Study/osqp_study/osqp-eigen_smooth/lib

既然你已经移动了eigen3OsqpEigen到指定的目录,那么你在使用CMake构建项目时需要确保它能够在这些新位置找到这些资源。

以下是如何更新你的CMakeLists.txt以适应新的路径的指导:

  1. 设置Eigen3的头文件路径:

    在你的CMakeLists.txt中,为Eigen3设置头文件路径:

    set(EIGEN3_INCLUDE_DIR /home/ubuntu/Code_Study/osqp_study/eigen3)
    include_directories(SYSTEM ${EIGEN3_INCLUDE_DIR})
    
  2. 设置OsqpEigen的头文件和库文件路径:

    同样地,在你的CMakeLists.txt中,为OsqpEigen设置头文件和库文件路径:

    set(OSQP_EIGEN_INCLUDE_DIR /home/ubuntu/Code_Study/osqp_study/osqp-eigen_smooth/include)
    set(OSQP_EIGEN_LIB_DIR /home/ubuntu/Code_Study/osqp_study/osqp-eigen_smooth/lib)
    
    include_directories(SYSTEM ${OSQP_EIGEN_INCLUDE_DIR})
    link_directories(${OSQP_EIGEN_LIB_DIR})
    
  3. 链接OsqpEigen库:

    当你为你的目标链接库时,确保链接正确的库文件。假设你的库名仍然是libOsqpEigen.so或类似的,你可以这样做:

    target_link_libraries(MPCExample osqpEigen)
    

总的来说,你的CMakeLists.txt现在应该类似于以下内容:

cmake_minimum_required(VERSION 3.1)
set(CMAKE_CXX_STANDARD 11)
project(OsqpEigen-Example)

# Eigen3 path
set(EIGEN3_INCLUDE_DIR /home/ubuntu/Code_Study/osqp_study/eigen3)
include_directories(SYSTEM ${EIGEN3_INCLUDE_DIR})

# OsqpEigen paths
set(OSQP_EIGEN_INCLUDE_DIR /home/ubuntu/Code_Study/osqp_study/osqp-eigen_smooth/include)
set(OSQP_EIGEN_LIB_DIR /home/ubuntu/Code_Study/osqp_study/osqp-eigen_smooth/lib)
include_directories(SYSTEM ${OSQP_EIGEN_INCLUDE_DIR})
link_directories(${OSQP_EIGEN_LIB_DIR})

# MPCExample
add_executable(MPCExample src/MPCExample.cpp)
target_link_libraries(MPCExample osqpEigen)

这样设置后,CMake应该能够在你指定的新位置找到eigen3OsqpEigen的资源,并正确地构建你的项目。

6 上面的osqp代码出现的问题

losqpEigen
collect2: error: ld returned 1 exit status
CMakeFiles/MPCExample.dir/build.make:96: recipe for target 'MPCExample' failed
make[2]: *** [MPCExample] Error 1
CMakeFiles/Makefile2:82: recipe for target 'CMakeFiles/MPCExample.dir/all' failed
make[1]: *** [CMakeFiles/MPCExample.dir/all] Error 2
Makefile:90: recipe for target 'all' failed
make: *** [all] Error 2

这个错误表示在链接阶段出现了问题,具体地说,collect2: error: ld returned 1 exit status 是链接器出错的标志。根据给出的信息,它与OsqpEigen有关。

为了解决这个问题,我们需要确保以下几点:

  1. 确保库文件存在: 首先,确保你提到的 /home/ubuntu/Code_Study/osqp_study/osqp-eigen_smooth/lib 路径下确实有 OsqpEigen 的库文件。

    ls /home/ubuntu/Code_Study/osqp_study/osqp-eigen_smooth/lib
    

    检查输出中是否有类似 libOsqpEigen.solibOsqpEigen.a 的文件。

  2. 正确链接库文件:

    在你的 CMakeLists.txt 中,确保你的 target_link_libraries 调用与你的库文件名相匹配。例如,如果你的库文件名为 libOsqpEigen.so,则应链接 OsqpEigen(注意CMake会自动添加lib前缀)。

    target_link_libraries(MPCExample OsqpEigen)
    
  3. 可能的依赖问题:

    OsqpEigen 可能依赖其他的库。你需要确保链接了所有必要的库。对于 OsqpEigen,除了 Eigen3(它是一个头文件-only库,所以不需要链接)之外,你可能还需要链接 OSQP 库。确保你也找到并链接了它。

  4. 详细的错误信息:

    你提供的错误信息相对简短,但链接错误通常会在之前的行中给出详细的描述。查看错误输出中是否有关于缺失的符号或文件的信息,这可以帮助确定问题所在。

  5. 重新构建:

    有时,简单地从头开始构建可能会解决问题。尝试删除构建目录下的所有文件,然后重新运行 cmakemake

  6. 检查路径:

    既然你移动了库和头文件,确保所有路径都被正确地设置。特别是,检查你的 CMakeLists.txt 中是否正确地设置了头文件和库文件的路径。

如果上述建议都不能解决问题,请提供更多关于链接错误的详细信息,这样我可能会更有帮助。

7 还是没有解决,但是错误更加明确了


/usr/bin/ld: CMakeFiles/MPCExample.dir/MPCExample.cpp.o: undefined reference to symbol 'csc_spalloc'
/usr/local/lib/libosqp.so: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
CMakeFiles/MPCExample.dir/build.make:96: recipe for target 'MPCExample' failed
make[2]: *** [MPCExample] Error 1
CMakeFiles/Makefile2:82: recipe for target 'CMakeFiles/MPCExample.dir/all' failed
make[1]: *** [CMakeFiles/MPCExample.dir/all] Error 2
Makefile:90: recipe for target 'all' failed
make: *** [all] Error 2

这个错误现在更明确了。undefined reference to symbol 'csc_spalloc'/usr/local/lib/libosqp.so: error adding symbols: DSO missing from command line 表示链接器在试图链接 libosqp.so 时遇到了问题。特别是,它没有找到对 csc_spalloc 符号的定义。

这通常意味着你还需要链接其他库,这些库包含这些缺失的符号。在OSQP的情况下,你可能需要链接它所依赖的线性代数库。

这里是如何解决这个问题的:

  1. 确保你链接了OSQP库:

    在你的 CMakeLists.txt 中,如果还没有做,添加对OSQP库的链接:

    target_link_libraries(MPCExample OsqpEigen OSQP::OSQP)
    

    请注意,具体的库名可能会有所不同,这取决于你的系统和你如何安装OSQP。如果它不是 OSQP::OSQP,则可能只是 OSQP

  2. 链接其他必要的库:

    OSQP可能依赖于其他线性代数库,比如 qdldl 或其他库。确保你链接了这些库:

    target_link_libraries(MPCExample OsqpEigen OSQP::OSQP qdldl)
    

    同样,请根据你的系统和安装来修改库的名字。

  3. 确保库的搜索路径是正确的:

    使用 link_directories 指令确保CMake知道在哪里找到所有的库文件:

    link_directories(/usr/local/lib)  # or wherever libosqp.so is located
    

尝试上述更改后重新构建你的项目。如果仍然遇到问题,请提供更多关于你的设置的详细信息,这样我可以提供更具体的帮助。

8 我都是.so文件,你用link是不是不太行

如果你正在使用动态链接库(.so文件),那么确实应该使用target_link_libraries()进行链接。当我提到link_directories,我是为了确保链接器知道去哪里找这些.so文件。

但是,你提到的DSO missing from command line错误表明你可能遗漏了某些必要的库。这不是一个关于是否是.so文件的问题,而是关于确保所有必要的库都被链接到你的应用程序。

这里是一些建议:

  1. 确保链接所有必要的库:

    如果你的应用程序依赖于OsqpEigen,它可能还间接依赖于其他库,例如OSQP或其他库。你需要确保你链接了所有这些库。

    target_link_libraries(MPCExample OsqpEigen osqp ...)
    

    这里的...意味着可能还需要链接其他的库。具体需要哪些取决于OsqpEigenOSQP的依赖关系。

  2. 检查库文件的名字:

    根据你的系统和安装方式,库文件的名字可能有所不同。例如,它可能是libosqp.solibOsqpEigen.so。确保你在target_link_libraries中使用的名字是正确的。通常,你应该省略lib前缀和.so后缀,例如osqp

  3. 明确指定完整的库路径:

    如果你知道每个库文件的确切位置,你也可以在target_link_libraries中使用完整路径。例如:

    target_link_libraries(MPCExample /path/to/libOsqpEigen.so /path/to/libosqp.so)
    
  4. 确保你的系统知道在哪里找到这些库:

    在运行时,操作系统需要知道去哪里找到.so文件。你可以使用LD_LIBRARY_PATH环境变量来指定搜索路径:

    export LD_LIBRARY_PATH=/path/to/libraries:$LD_LIBRARY_PATH
    

    或者,你可以考虑将这些库的路径添加到/etc/ld.so.conf或相关的配置文件中,并运行ldconfig

尝试这些建议,看看是否可以解决你的问题。如果仍然遇到困难,再告诉我更多细节,我会尽量帮助你。

9 解决完成以后的示例代码如下:

cmake_minimum_required(VERSION 3.1)
set(CMAKE_CXX_STANDARD 11)
project(OsqpEigen-Example)

# Eigen3 path
set(EIGEN3_INCLUDE_DIR /home/ubuntu/Code_Study/osqp_study/eigen3)
include_directories(${
   EIGEN3_INCLUDE_DIR})

# OsqpEigen paths
set(OSQP_EIGEN_INCLUDE_DIR /home/ubuntu/Code_Study/osqp_study/osqp-eigen_smooth/include)
set(OSQP_EIGEN_LIB_DIR /home/ubuntu/Code_Study/osqp_study/osqp-eigen_smooth/lib)
include_directories(${
   OSQP_EIGEN_INCLUDE_DIR})
link_directories(${
   OSQP_EIGEN_LIB_DIR})

# set the custom osqp paths
set(OSQP_CUSTOM_PATH "/home/ubuntu/Code_Study/osqp_study/osqp_path_smooth")
set(OSQP_INCLUDE_DIR "${OSQP_CUSTOM_PATH}/include")

你可能感兴趣的:(1024程序员节)