将C库从Linux(Ubuntu)移植到OS X时,我遇到链接器问题.C代码是从Matlab自动生成的,所以理想情况下我不想更改代码本身.
问题似乎是在一个C文件中,它只包含未初始化的变量声明,然后被其他C文件EXTERN实现Matlab算法.OS X链接器显然无法识别此文件中的符号.相同的源代码在Linux上运行良好,所以我想了解OS X链接器的行为方式不同,以及是否有一个标志我可以传递给它来改变行为.
静态库构建时没有错误/警告.但是在构建引用静态库的应用程序时,会抛出以下错误消息(在OS X上):
Undefined symbols for architecture x86_64:
"_my_var", referenced from:
_algorithm in libtestlibrary.a(algorithm.o)
ld: symbol(s) not found for architecture x86_64
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)
'nm'表示libtestlibrary.a确实包含符号_my_var.
下面是Matlab代码的简化版本.
图书馆代码:
// DATA.C : declaration of data
#include "data.h"
int my_var;
// DATA.H - extern declaration of data
#ifndef H_DATA
#define H_DATA
extern int my_var;
#endif
// ALGORITHM.C - performs the calculation
#include "data.h"
int algorithm(int x) {
my_var += x;
return my_var;
}
//ALGORITHM.H - declaration …Run Code Online (Sandbox Code Playgroud) 我正在使用 ffmpeg 将视频转码为 .ts 格式,但在输出文件中出现意外的开始时间。
为了简化事情,我从一个简单的 AVI 文件开始(无音频):
ffmpeg -i in.avi
...
Input #0, avi, from 'in.avi':
Metadata:
encoder : Lavf55.25.100
Duration: 00:00:05.00, start: 0.000000, bitrate: 448 kb/s
Stream #0:0: Video: mpeg4 (Simple Profile) (FMP4 / 0x34504D46), yuv420p, 480x270 [SAR 1:1 DAR 16:9], 24 tbr, 24 tbn, 24 tbc
Run Code Online (Sandbox Code Playgroud)
正如预期的那样, Duration=5s,startTime=0s。
但是,如果我转码为 .ts 文件而不进行自定义:
ffmpeg -i in.avi -y out.ts
...
Input #0, avi, from 'in.avi':
Metadata:
encoder : Lavf55.25.100
Duration: 00:00:05.00, start: 0.000000, bitrate: 448 kb/s
Stream #0:0: …Run Code Online (Sandbox Code Playgroud)