我正在使用arm-linux-gnueabi-g ++ 4.7.3版进行编译.
我在位置安装了arm-linux-gnueabi库:
/ usr/arm-linux-gnueabi/lib,它包含libdl.a,libdl.so,libdl.so.2和libdl-2.19.so.
libdl.so链接到libdl.so.2,链接到libdl-2.19.so.
我试图链接到dl库(请参阅下面的命令字符串),但我总是得到未定义的引用错误.
arm-linux-gnueabi-g++ -I. -I../ -I../Comms/Linux -Wall -DLINUX -fpic -o ../../work/MyProgram main.o
-L../../work -L/usr/arm-linux-gnueabi/lib -lComms -lConsole -lUtilities -ldl
../../work/libUtilities.so: undefined reference to `dlsym'
../../work/libUtilities.so: undefined reference to `dlopen'
collect2: error: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
如果我使用g ++ 4.8.2使用以下命令编译,那么我的程序编译,链接和执行正常.
g++ -I. -I../ -I../Comms/Linux -Wall -DLINUX -fpic -o ../../work/MyProgram main.o
-L../../work -lComms -lConsole -lUtilities -ldl
Run Code Online (Sandbox Code Playgroud)
显然它找不到libdl.so库; 我认为通过使用-L标志将路径添加到相应库的位置将解决问题,但事实并非如此.
我对ARM编译器命令缺少什么?
我在其中一个C拼图中看到了这个问题!! 这真的有可能吗?
如果将其名称作为字符串,我该如何调用函数?是否可以使用scanf读取的字符串直接用于调用函数?
我已经想到了if(strcmp(str,"string"))然后调用该函数.
但还有其他方法吗?
好的,这就是我需要的:
func有一些值,由用户给出(不是常数)func?更新:
也许我认为我需要的是非常明显的,但是因为我注意到许多downvotes,你在这里:
string func = "myfunc";
Run Code Online (Sandbox Code Playgroud)
我需要一些call(func)会打电话的东西myfunc.像PHP的call_user_func_array()
有任何想法吗?
我看了一下mixins,但这看起来并不像我需要的那样.
PS我标注的问题与c和c++太,因为一个通用的解决方案可能是理论上的可能,考虑到语言之间的相似之处.
为什么-rdynamic不导出.a文件中的符号,而是导出.o文件中的符号?
我在.so文件中有一个应用程序和一个插件.主应用程序使用一系列目标文件和一个静态库链接,如下所示:
CXXFLAGS = $(CXXFLAGS_COMMON) -rdynamic
STATICLIBS = ../Utilities/Utilities.a
...
all:
$(CXX) $(CXXFLAGS) -o $(SAMPLE) main.o $(STATICLIBS) $(SHAREDLIBS) $(INCLUDES)
Run Code Online (Sandbox Code Playgroud)
(CXX是Ubunut上的g ++ 4.5.2,我主要使用-std = c ++ Ox进行编译)
在这种情况下,不导出Utilities.a中的符号(即"objdump -t a.out | grep symbol"为空).
如果我使用"ar x"来仅仅使用.o来提取.a和.链接中的.o文件,那么这些符号将被插件导出并找到(如果你想知道的话加载了dlopen).
我尝试过使用-Wl,-export-dynamic但没有成功.
如上所述,我确实有一个解决方法,但我仍然希望了解我所缺少的内容.提前致谢 !
在C++中,有任何函数在定义变量时返回"true",反之亦然.像这样的东西:
bool isDefined(string varName)
{
if (a variable called "varName" is defined)
return true;
else
return false;
}
Run Code Online (Sandbox Code Playgroud) 我想编写一个从stdin读取的程序:scanf("%s %s", foo, args);然后使用参数运行函数foo(之前在程序中定义): foo(args);我不知道如何在C中执行此操作.我之前可以很容易地在Shell中做到这一点,但在C中似乎很难
我已经读过 C不支持动态函数调用.我的程序有越来越多的测试用例作为单独的函数实现,如 -
int testcase1(void);
int testcase2(void);
int testcase3(void);
Run Code Online (Sandbox Code Playgroud)
每次我添加一个新的测试用例时,我还必须将调用添加到我的主函数中,如:
int main(int argc, char **argv){
assert(!testcase1());
assert(!testcase2());
assert(!testcase3());
}
Run Code Online (Sandbox Code Playgroud)
我更愿意调用类似于assert(!testcase*())*匹配任何解析为我的程序中的有效函数名称的字符串.
你能想到一个更方便的解决方案吗?