我正在使用以下功能: function MakeLinks($source){ return preg_replace('!(((f|ht){1}tp://)[-a-zA-Zа-яА-Я()0-9@:%_+.~#?&;//=]+)!i', '$1', $source); } function simpleWiki($text){ $text = preg_replace('/\[\[Image:(.*)\]\]/', '', $text); return $text; } 第一个将http://example.com转换为 http://example.com link. 第二个函数将字符串像[[Image:http://example.com/logo.png]]变成图像. 现在,如果我有文本 $text = 'this is my image [[I
以下是关于 linker 的编程技术问答
长时间的听众,第一次呼叫者.我知道这是一个有些晦涩的问题,不要期望太多. : - ) 我有以下ADA文件: entrer.ads package Greeter is procedure Hello; end Greeter; forter.adb with Ada.Text_IO; use Ada.Text_IO; package body Greeter is procedure Hello is begin Put_Line ("Hello, world!"); end Hello; end Greeter; 并将它们编译成这样的共享对象: gnatmake -z -fPIC greeter.adb gcc -shared -o libgreeter.so greeter.o 这可以很好地编译. nm显示以下符号: $ nm -D libgreeter.so
我知道GCC中的链接顺序对于正确确定的符号很重要.但 现在,我看到了由此产生的可执行文件的奇怪速度问题.我将对象和大型链接为 g ++ -M32 A.O B.O AR1.A AR2.A -LM -LPTHREAD -LCRYPT -LZ -LZ -PTHREAD -O AFAST.OFAST.OUT.OUT vs g ++ -m32 a.o ar1.a b.o ar2.a -lm -lpthread -lcrypt -lz -lz -pthread -o aslow.out.out 第二版本慢2倍. B.O实际上是在AR1中,但AR2.O对此有所参考,因此Linker抱怨,因此我不得不将B.O.一开始,我一直将B.O一直延伸到链接的末端,以制定正确的依赖性顺序,尽管然后弄清楚它甚至在开始时甚至更快地工作. 有人经历过吗?对象文件链接顺序与拱门订单不同吗?怎么会有任何速度影响? 使用GCC3.4.6或GCC4.1.2 获得类似的结果 解决方案 在执
我将大约50个不同的静态库链接到我的C ++项目中,并且链接平均需要70秒. 我发现这次库的链接顺序随着链接顺序而四处走动.我猜这是可以预料的,如果链接器不必继续在整个符号表中搜索一组符号,那么它已经构建了到这一点. 我想我可以使用" nm"在静态库之间获取依赖关系图.但是,这只会给我一个"正确"的链接顺序.获得最快的链接顺序涉及的因素是什么? 我感觉到这与上述依赖图有关,通过获得试图最大程度减少一些数量的遍历,但我真的不确定哪个. 任何帮助将不胜感激. 我时不时地使用英特尔编译器和GCC编译器.当我用顶部检查时,他们俩似乎都在使用GNU LD链接器.希望这会有所帮助... 因此,为了更多地澄清我要问的内容,我已经知道如何从一组静态库中获取1次通用订购.我自己写了这个脚本,但是正如Olaf的答案所暗示的那样,有许多著名的工具可以做到这一点. 我的问题是,我已经有两个1个通用链路订购,其中一个在〜85s中运行,另一个在〜70年代运行.因此,很明显,
我被HAL_DELAY()函数所困.当我调用此函数hal_delay()时,控制卡在无限循环中. 在搜索问题时,我发现了这个 在此特定的评论中,我引用了"链接文件有问题,请使用附加的文件.您需要单独映射两个内存库,因此首先是SRAM1 96K,然后是32K的SRAM2.我认为应该报告这一点.作为Cubemx中的错误,因为它会生成不良的链接文件."并且有两个带有.ld扩展名的文件. 我正在寻找的是如何在项目中使用此文件或其他任何更好的选择来处理此问题. ps.我正在使用STM32L476 Discovery Board,Cube MX 5.0.0和Attolic True Studio. 编辑 我的项目正在进行RS485通信,从我获取数据的位置,并且我有两个任务,并在Max7219显示上显示,并使用SIM800 GSM模块将其发送到Internet. 控制控制的代码.请注意,仅在执行GSM任务时才调用此功能. void vMyDelay(uint1
我试图将我的小应用程序从Win XP和VS 2005中移植到Win 7和VS2010. . 该应用程序编译并以调试模式平稳运行,但是在发布模式下,我会收到以下错误: pcrecpp.lib(pcrecpp.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in LoginDlg.obj 我应该从哪里开始检查? 解决方案 您的应用程序正在以发布模式进行编译,但是您正在针对具有/MTD(或类似)集的Debug版本链接,从而导致CRT中的迭代器调试级别的不匹配./p> 在发布模式下重新编译PCRE匹配您自己的应用程序. pragma 在VS 2010中发出错误. 参见 . 其他解决方案 我有相同的错误.就我而言,解决方案很容易:我有一个项目A,具体取决于另一个项目.B在调试模式下具有预处理器定义
尝试将我的程序与5.5服务器提供的MySQL库链接时,我会收到undefined reference to 'mysql_suchandsuch@#'消息.安装MySQL后,我使用了默认路径,Windows上的Windows是C:\Program Files\MySQL\MySQL Server 5.5\.最初,我以为这些空间正在引起我的悲伤,但是我认为我正确地弄清楚了如何在没有空间的情况下指向图书馆路径(仍然没有运气).如果还有另一个可能的原因,请告诉我. 我在此网站上回顾了一系列问题,试图解决我的问题... 问题1 问题2 问题3 问题4 问题5 问题6 问题7 使用mingw/g ++,我试图根据自己的研究以及在此处提出的建议使用以下选项链接: -l" c:\ program文件\ mysql \ mysql Server 5.5 \ lib \" -llibmysql.lib -l" c:\ program文件\ mysql \ mysql
我有一个脚本,需要防止与标准库路径到ld的GCC通过.使用-nostdlib抑制-lc -lgcc等.但不限制-L.使用-Wl,-nostdlib可防止链接使用其自己的标准路径,但不会阻止GCC使用标准路径传递-L.有什么办法可以确保GCC调用链接器在库路径中没有任何内容期望我在命令行上明确编写的目录? 解决方案 我找到了一个解决方案,但取决于-wrapper选项的GCC 4.4或以后(脚本的略有更新版本): inc=/path/to/alt/incl lib=/path/to/alt/libs crt=/path/to/alt/crt1.o gcc -wrapper sh,-c,' x= ; z= ; s= ; for i ; do [ "$z" ] || set -- ; z=1 case "$i" in -shared) s=1 ; set -- "$@" "$i" ;; -Lxxxxxx) x=1 ;; -xxxxxx) x= ; [ "$s" ] || set -
我刚刚在我的新Ubuntu 12.10服务器上编译了Chironfs,并收到以下错误: gcc -Wall -W -Wmissing-prototypes -g -O2 -DFUSE_USE_VERSION=25 -D_FILE_OFFSET_BITS=64 -I/usr/local/include -g -O2 -lm -lfuse -o chironfs chironfs.o chiron-conf.o chirondbg.o chironfn.o chironfs.o: In function `chiron_init': /root/chironfs-1.1.1/src/chironfs.c:2000: undefined reference to `pthread_create' chironfs.o: In function `get_rights_by_name': /root/chironfs-1.1.1/src/chironfs.c:452: undefi
我正在尝试将MPI与D编程语言一起使用. D完全支持C ABI,并可以与任何C代码链接并调用.我已经完成了明显的工作,并将MPI标头转换为D. Wikipedia 向D.我用以下命令编译了它: dmd test.d -L-lmpistubs 当我刚运行./test并打印时,它起作用: 0: We have 1 processors 但是,当我使用mpiexec -n 8 test运行时,它没有打印.我的理解是,MPI可执行文件需要一堆奇怪的链接选项,这就是为什么存在像mpicc这样的工具来自动化过程的原因.但是,如果我尝试在D中使用MPI,这对我无济于事.我认为这是因为我不使用正确的链接器选项.有人可以告诉我mpicc做什么,以及如何使DMD做同样的事情? 编辑:我使用mpicc -showme找到了答案.这显示了命令mpicc转发到gcc.但是,我也意识到我对标头文件翻译错误.下一个问题:如何正确处理. 解决方案 mPICC是不同脚本甚至程序的通用
我被授予创建两个标题文件H1.H和H2.H;两个C文件A1.C和A2.C;和一个主文件MainFile.C. A1文件包括H1标头文件,A2包括H2标头文件,MainFile包括两个标头文件. 现在,我想将它们链接在一起以获取一个可执行的.exe文件. 我知道,如果只有两个C文件(A1.C和A2.C)存在1个标头文件(X.H),我们可以使用: gcc -c a1.c gcc -c a2.c gcc -o x_exe a1.o a2.o ./x_exe 谁能为我的问题提出相同格式的东西吗? 解决方案 一般而言,您将每个.c文件编译到.o文件中,然后将.O文件链接到可执行文件中. 因此,对于您的特定示例,您将按照以下方式编译源文件: gcc -c a1.c gcc -c a2.c gcc -c mainfile.c 和链接如下: gcc -o x_exe a1.o a2.o mainfile.o 除非它们在与源不同的目录中,否则您不必担心标题
我有头util.hpp包含一个简单的结构: // util.hpp struct Point { float x; float y; }; 两个CPP文件,我们称其为a.cpp和b.cpp,都包括util.hpp: // a.cpp #include "util.hpp" void funcA(float _x, float _y) { Point p; p.x = _x; p.y = _y; // ... } // b.cpp #include "util.hpp" void funcB(float _x, float _y) { Point p; p.x = _x; p.y = _y; // ... } int main() { // ... } 当我单独编译a.cpp和b.cpp时,然后将它们链接在一起,我没有错误. 为什么?由于我在两个文件中都包含util.hpp,所以我们是否有struct P
我正在尝试覆盖C 当功能在同一汇编单元中使用时,我会面临问题.在下面的代码中,我试图替换函数get_resolution(),但是只有在test.c进行时,我才能实现它,但不能从display.c 中实现. // display.c ------------------------------------------------------------- #include void get_resolution() { printf("Original get_resolution\n"); } void display() { get_resolution(); } // test.c ---------------------------------------------------------------- #include void __wrap_get_resolution() { printf(
为了记录呼叫,我想覆盖某些函数调用到各种API,但是我也可能想在将数据发送到实际函数之前操纵数据. 例如,说我在源代码中使用了一个称为getObjectName数千次的函数.我想有时暂时覆盖此功能,因为我想更改此功能的行为以查看不同的结果. 我创建一个新的源文件: #include const char *getObjectName (object *anObject) { if (anObject == NULL) return "(null)"; else return "name should be here"; } 我像平常一样编译所有其他来源,但是在与API库链接之前,我首先将其链接到此功能.这正常工作,除了我显然无法在我的超级功能中调用真实功能. 是否有一种更简单的方法来"覆盖"功能而不收到链接/编译错误/警告?理想情况下,我希望能够通过编译和链接一两个文件来覆盖
我有一个广泛使用的C ++库,该库保存着: foo(); 我想超载此函数以具有默认参数,例如: foo(bool verbose=false); 这种变化是否迫使我重新编译使用此功能的每个代码? 没有参数的情况下,请致电foo(),因为no-args-signature没有改变? 顺便说一句 - 我正在使用GCC 谢谢 解决方案 这种变化是否迫使我重新编译使用此功能的每个代码? 是的,并且编译将失败,因为会有歧义. 您能做的就是使函数像这样: foo(bool verbose); 并将案例foo()视为false. 这不需要重新编译.您只有两个功能: foo() { foo(false); } //possibly foo(bool verbose); 而不是带有默认参数的一个. 其他解决方案 如果您是说要同时拥有两者,那么您将无法知道您的意思. 如果您是说要foo() foo() foo
我尝试提供-L /usr/local/lib,尝试-nostdinc++,尝试设置DYLD_LIBRARY_PATH和DYLD_FALLBACK_LIBRARY_PATH,但是otool唤醒给我: otool -L sample sample: /usr/lib/libc++.1.dylib (compatibility version 1.0.0, current version 1.0.0) /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 169.3.0) 如何在OS X上链接到我的自定义编译/usr/local/lib/libc++.dylib? 汇编的变化是基本的clang++ -std=c++11 -stdlib=libc++. 解决方案 正如您所指出的,otool with -l告诉您libc ++.1.dylib正在/usr/lib.
尝试从Zeromq教程编译示例Hello_world.c: 应接收 可以肯定的是,我在OSX Mountain Lion中安装了所有东西. clang -Wall hwserver.c -o hwserver 给我一个错误: Undefined symbols for architecture x86_64: "_zmq_bind", referenced from: _main in hwserver-OgrEe6.o "_zmq_ctx_new", referenced from: _main in hwserver-OgrEe6.o "_zmq_msg_close", referenced from: _main in hwserver-OgrEe6.o "_zmq_msg_data", referenced from: _main in hwserver-OgrEe6.o "_zmq_msg_init", r
我将系统从10.8升级到10.9,并相应地将Xcode从5.0升级到5.0.1. . 当我尝试运行将多个文件结合到一个,更大的,共享的lib中的构建的一部分时,我得到了奖励: Undefined symbols for architecture x86_64: "__ZNKSt3__112basic_stringIcNS_11char_traitsIcEENS_9allocatorIcEEE13find_first_ofEPKcmm", referenced from: __ZN2bt3fst12FstLookupSet14loadFromStringERKNSt3__112basic_stringIcNS2_11char_traitsIcEENS2_9allocatorIcEEEESA_ in libbtfst.a(bt_fst_factory.o) 过滤的问题符号为: __ZNKSt3__112basic_stringIcNS_11cha
从10.8移至10.9打破了我的 wfdb 安装, -lwfdb 找不到库. 这个程序 #include int main(void) { return 0; } 链接上的错误(因为必须包括Mavericks,-I/usr/include,否则编译器错误): 567 ~/ clang -I/usr/include c.c -o c -lwfdb ld: library not found for -lwfdb 我也尝试过添加 -L/usr/lib (其中libwfdb.10.5.20.dylib,libwfdb.10.dylib和libwfdb.dylib已找到),但是ld仍然找不到-lwfdb, 似乎完全删除了gcc. LD_LIBRARY_PATH似乎仅运行时.一切都在山狮子下工作. 我还应该尝试什么? a 解决方案 仔细阅读clang's -v erbose输出(续下)... 568 ~/ clang