我正在使用CMake进行两个版本的项目,其中一个需要-lglapi而另一个则不需要.
到目前为止,我们使用的线条看起来像这样:
SET(CMAKE_C_FLAGS "-O3 -xSSE3 -restrict -lpthread -lX11 -ldrm")
SET(CMAKE_CXX_FLAGS "-O3 -xSSE3 -restrict -lpthread -lX11 -ldrm")
Run Code Online (Sandbox Code Playgroud)
我在我的CMakeList.txt中添加了一个if语句,紧跟在这些行之后:
if(SINGLE_MODE)
SET(CMAKE_C_FLAGS ${CMAKE_C_FLAGS} " -lglapi")
SET(CMAKE_CXX_FLAGS ${CMAKE_CXX_FLAGS} " -lglapi")
endif(SINGLE_MODE)
Run Code Online (Sandbox Code Playgroud)
SINGLE_MODE变量定义了一点点.当我使用message命令显示标志变量的内容时,它看起来没问题:
-O3 -xSSE3 -restrict -lpthread -lX11 -ldrm -lglapi
Run Code Online (Sandbox Code Playgroud)
但是当我开始编译时,我遇到了编译错误.使用详细模式我意识到在编译器调用中看起来像:
-O3 -xSSE3 -restrict -lpthread -lX11 -ldrm; -lglapi
Run Code Online (Sandbox Code Playgroud)
也就是说,在将-lglapi添加到列表之前添加了分号.
这里有没有人遇到类似的问题,并知道解决这个问题的方法?我用谷歌搜索了很长一段时间并研究了CMake手册,但看不出我在这里做错了什么.
谢谢,托比亚斯
正如标题所示,我进入我的应用程序的构建设置,并搜索"其他链接标志",没有什么是回归.如果我甚至只搜索"其他",则没有"其他链接标志"部分.我在网上看到了其他这种情况,但没有找到解决方案.我怎样才能找到其他链接标志?
所有帮助赞赏.
gcc/g ++链接器选项"-Map"用于生成什么".map"文件?以及如何阅读它们?
Build Phases - > Link Binary与Libraries或Build Settings - > Linker Flags有什么区别?
前者似乎不允许您在Debug与Release之间进行指定,并且其中指定的框架似乎也与后者不匹配.
注意:我已经检查了SO上的现有帖子,但没有找到能够准确回答这个问题的帖子.
我正在寻找二进制加密代码生成的选项,并找到两个可用的PIC和PIE选项.我试图找到两者之间的差异,但没有找到合适的文章.如果有人可以通过例子与专业人士和玉米来解释差异,或者提供好文章的链接将是很好的学习.
我的基本动机是保护已编译的代码,因为ELF/PE格式可能受到病毒的攻击,或者可能被黑客入侵,或者在反向技术的帮助下可以重新生成代码.还要提供任何其他方法来保护编译代码免受攻击和d-compling.
我正在使用GCC Compiler通过Cygwin构建跨平台应用程序.
CMake似乎在GCC编译命令的前面添加链接器标志,而不是在末尾附加它.如何使CMake附加链接器标志?
这是一个重现问题的简单示例.考虑使用以下C++代码clock_gettime:
// main.cpp
#include <iostream>
#include <time.h>
int main()
{
timespec t;
clock_gettime(CLOCK_REALTIME, &t);
std::cout << t.tv_sec << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是一个CMakeLists.txt来编译上面的C++文件:
cmake_minimum_required(VERSION 2.8)
set(CMAKE_EXE_LINKER_FLAGS "-lrt")
add_executable(helloapp main.cpp)
Run Code Online (Sandbox Code Playgroud)
请注意,我们已添加,-lrt因为它有定义clock_gettime.
使用以下方法编译:
$ ls
CMakeLists.txt main.cpp
$ mkdir build
$ cd build
$ cmake ..
$ make VERBOSE=1
Run Code Online (Sandbox Code Playgroud)
即使您可以-lrt在命令中看到,这会引发此错误:
/usr/bin/c++ -lrt CMakeFiles/helloapp.dir/main.cpp.o -o helloapp -rdynamic
CMakeFiles/helloapp.dir/main.cpp.o: In function `main':
main.cpp:(.text+0x15): undefined reference to `clock_gettime'
collect2: ld returned 1 exit status
make[2]: *** …Run Code Online (Sandbox Code Playgroud) 我在stackO中看到了这个和答案,但没有找到如何排除文件夹.
我有3个文件夹,有很多.h,.m和.mm,我需要暂时排除它们,但不要删除引用.我怎样才能做到这一点?
[更新] 很抱歉置顶,但首先了解这一点可能会有所帮助,因为它可能会改变问题。
\n\n这--wrap是链接器的一个选项ld,而不是gcc。
但我的 Eclipse 项目用于gcc链接阶段。
如何根据cmocka单元测试的需要使用包装函数?
我在用gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3。
我正在尝试使用此处--wrap指定的链接器选项,以便使用cmocka对 C 代码进行单元测试。
错误是
\n\nmake all \nBuilding target: unit_test_C_code_example_project\nInvoking: GCC C Linker\ngcc --wrap=add -o "unit_test_C_code_example_project" ./test_scripts/test_maths.o ./software_under_test/mocks/mock_add.o ./software_under_test/maths.o -lcmocka\ngcc: error: unrecognized option \xe2\x80\x98--wrap=add\xe2\x80\x99\nmake: *** [unit_test_C_code_example_project] Error 1\nRun Code Online (Sandbox Code Playgroud)\n\n因此,链接器抱怨该--wrap=add选项,但我不知道为什么。
不可避免的是,如果我不发布代码,有人会请求它,所以就在这里,尽管我怀疑它与链接器选项问题相关:
\n\n在我的单元测试主要中,我有
\n\nstatic void test_multiply_two_by_three(void **state)\n{\n will_return(__wrap_add(0, 2), 2);\n …Run Code Online (Sandbox Code Playgroud) 我已经安装了R软件包,但是为了通过加载library,需要将LD_LIBRARY_PATH设置为其中一个库(称为libhts.so.2)的路径。只有在进入R之前而不是之后才编辑LD_LIBRARY_PATH时,加载才起作用。
我尝试了几种不同的方法来解决这个问题:
configureR包中的脚本导出修改后的LD_LIBRARY_PATH 。configure脚本中创建到共享库的软链接。两者都不起作用,在我看来,一旦启动R,就有一个变量存储LD_LIBRARY_PATH的结果。也许解决方案是编辑该变量。
在我的项目中,我有大量的静态库.我目前使用-ObjC链接器标志,它将包含实现任何objective-c类的静态库的所有成员.
我有一个特别大的静态库,我特别想要只用于二进制文件中的类(我知道objective-c的动态特性和这样做的注意事项).如果不使用-ObjC,会发生这种情况.
是否可以向链接器指定我希望此特定库不属于-ObjC标志?
如果完成此任务的唯一方法是为我以某种方式弄清楚包含objc的每个其他库添加force_load标志,那将是不幸的.