$(WindowsSDK _ MetadataPath) Linux c + + 错误: 对“ dlopen”的未定义引用

$(WindowsSDK _ MetadataPathVersioned)

我使用 C + + (Eclipse)在 Linux 中工作,想使用一个库。 $(WindowsSDK _ PlatformPath) Eclipse 向我显示了一个错误:

undefined reference to 'dlopen'
$(WindowsSDK _ SupportedAPI _ arm)

你知道怎么解决吗?

$(WindowsSDK _ SupportedAPI _ x64)

这是我的代码:

#include <stdlib.h>
#include <stdio.h>
#include <dlfcn.h>


int main(int argc, char **argv) {
void *handle;
double (*desk)(char*);
char *error;


handle = dlopen ("/lib/CEDD_LIB.so.6", RTLD_LAZY);
if (!handle) {
fputs (dlerror(), stderr);
exit(1);
}


desk= dlsym(handle, "Apply");


if ((error = dlerror()) != NULL)  {
fputs(error, stderr);
exit(1);
}


dlclose(handle);
}
219715 次浏览
$(WindowsSDK _ SupportedAPI _ x86)

你必须链接到 libdl,添加

$(WindowsSDK _ UnionMetadataPath)

Ldl

$(WindowsSDK80Path)

连接器选项

$(WindowsSdkDir)

您需要为 makefile 做类似的操作:

LDFLAGS='-ldl'
make install
$(WindowsSdkDir _ 10)

将链接器标志从 make 传递给链接器。

$(WindowsSdkDir _ 81)

即使使用 -ldl,我也遇到了同样的问题。

$(WindowsSdkDir _ 81A) $(WindowsSDKToolArchitecture)

除了这个选项之外,源文件需要放在库之前,请参见 未定义的参考’dlopen & # 39;

$(WindowsTargetPlatformVersion) $(WinRT _ IncludePath)

@ Masci 是正确的,但是如果你正在使用 C 语言(和 gcc编译器) ,那么考虑到这个不起作用:

gcc -ldl dlopentest.c
$(WMSISProject)

但这个可以:

gcc dlopentest.c -ldl
$(WMSISProjectDirectory)

在 VisualStudio 中何处找到此列表:

    我花了点时间才想明白。

我也试过 LDFLAGS-ldl,但没有用。

你可以试着加上这个

LIBS=-ldl CFLAGS=-fno-strict-aliasing

我需要将 ?? C # 运算符应用到 JavaScript 中,但我不知道如何应用。

到配置选项

在 C # 中考虑这一点:

int i?=null;
int j=i ?? 10;//j is now 10
R > < code > int i? = null;

现在我在 JavaScript 中设置了这个:

var options={
filters:{
firstName:'abc'
}
};
var filter=options.filters[0]||'';//should get 'abc' here, it doesn't happen
var filter2=options.filters[1]||'';//should get empty string here, because there is only one filter
Int j = i? ? 10;//j 现在是10

我该怎么做才正确呢?

现在我在 JavaScript 中设置了这个:

var options={
filters:{
firstName:'abc'
}
};
var filter=options.filters[0]||'';//should get 'abc' here, it doesn't happen
var filter2=options.filters[1]||'';//should get empty string here, because there is only one filter

我该怎么做才正确呢?

谢谢。

谢谢。

编辑: 我发现了问题的一半: 我不能对对象使用“ indexer”符号(my_object[0])。有办法绕过它吗?(我事先不知道过滤器属性的名称,也不想对它们进行迭代)。

for ... in循环:

for(var p in options.filters) {
var someVar = options.filters[p]; //Returns the property being iterated
}

ES2020答案

Null 或未定义,否则返回其左侧操作数。

const options={
filters:{
firstName:'abc'
}
};
const filter = options.filters[0] ?? '';
const filter2 = options.filters[1] ?? '';

这将确保如果 filters[0]filters[1]nullundefined,那么这两个变量的回退值都是 ''

新的 无效凝聚操作符终于可以在 JavaScript 上使用了。但是,请注意 浏览器支持。您可能需要使用像 巴别塔这样的 JavaScript 编译器来将其转换为更向后兼容的内容。

根据文件记录,

请注意,空结合运算符不会返回其他类型的虚假值(如 0'')的默认值。如果希望说明所有虚假值,则应使用 OR 操作符 ||

来自 $man gcc

   -llibrary
-l library
Search the library named library when linking.  (The second
alternative with the library as a separate argument is only for POSIX
compliance and is not recommended.)
       It makes a difference where in the command you write this option; the
linker searches and processes libraries and object files in the order
they are specified.  Thus, foo.o -lz bar.o searches library z after
file foo.o but before bar.o.  If bar.o refers to functions in z,
those functions may not be loaded.

逻辑零分配,2020 + 解决方案

“嘶嘶”“嗡嗡”

增加了一个新的操作符 ??=,这相当于 value = value ?? defaultValue

函数式示例

function config(options) {
options.duration ??= 100
options.speed ??= 25
return options
}


config({ duration: 555 })   // { duration: 555, speed: 25 }
config({})                  // { duration: 100, speed: 25 }
config({ duration: null })  // { duration: 100, speed: 25 }

||=&&=是相似的,下面的链接。

= 浏览器支持 2021年9月 -90%

这将检查左侧是否为未定义或 null,如果已定义则为短路。如果不是,则为左侧分配右侧值。

Mozilla 文档

基本例子

let a          // undefined
let b = null
let c = false


a ??= true  // true
b ??= true  // true
c ??= true  // false


// Equivalent to
a = a ?? true

Mozilla 文档

对象/数组示例

let x = ["foo"]
let y = { foo: "fizz" }


x[0] ??= "bar"  // "foo"
x[1] ??= "bar"  // "bar"


y.foo ??= "buzz"  // "fizz"
y.bar ??= "buzz"  // "buzz"


x  // Array [ "foo", "bar" ]
y  // Object { foo: "fizz", bar: "buzz" }

函数式示例

function config(options) {
options.duration ??= 100
options.speed ??= 25
return options
}


config({ duration: 555 })   // { duration: 555, speed: 25 }
config({})                  // { duration: 100, speed: 25 }
config({ duration: null })  // { duration: 100, speed: 25 }

= 浏览器支持 2021年9月 -90%

Mozilla 文档

TLDR:

Rel = “ nofollow norefrer”> 更多详细教程

浏览器支持 92% 2020年7月

在 javascript 中也可以使用 int j=i ?? 10;,只需用 let代替 int即可。

?? vs ||

我用 CMake 来编译我的项目,我发现了同样的问题。

所描述的 给你解决方案非常有效,只需将 ${ CMAKE _ DL _ LIBS }添加到 target _ link _ library ()调用中

尝试使用标志 no-threads重新构建 开放(如果您正在链接它)。

??应该优先于 ||,因为它检查 只适用于空值和未定义的

然后试着这样链接:

target_link_libraries(${project_name} dl pthread crypt m ${CMAKE_DL_LIBS})

下面所有的表达都是正确的:

(null || 'x') === 'x' ;
(undefined || 'x') === 'x' ;
//Most of the times you don't want the result below
('' || 'x') === 'x'  ;
(0 || 'x') === 'x' ;
(false || 'x') === 'x' ;
//-----


//Using ?? is preferred
(null ?? 'x') === 'x' ;
(undefined ?? 'x') === 'x' ;
//?? works only for null and undefined, which is in general safer
('' ?? 'x') === '' ;
(0 ?? 'x') === 0 ;
(false ?? 'x') === false ;


在 GNU 工具链的早期版本(~ 2.7)中,glibc 没有与链接加载器的直接接口(dlopen 和 dlsym 函数) ,因此必须在编译时提供-ldl (libdl)。用最新的 glibc 版本就不需要这么做了。只要包含 < dlcfn.h > 就可以了。