小编pro*_*ron的帖子

如何在C++中构建运行时版本无关的DLL?

我的产品是一个C++库,在Windows上,它作为dll发布.它几乎没有使用c-runtime(基本的iostream就是这样),所以我确信所有最新版本的CRT都没问题.

由于我的客户端应该使用我的dll构建他的应用程序,我不想强​​加给他任何特定的运行时版本.我希望我的dll绑定到我的客户端的应用程序正在使用的任何运行时库版本(我可以假设他将使用动态链接为他的CRT).毕竟,这不是动态链接的全部意义吗?那可能吗?

编辑:将dll与静态运行时库链接也不起作用,因为静态运行时(来自dll)和动态运行时(来自客户端的应用程序)将混合,这是不好的.

编辑:我主要问的是如何告诉运行时加载器链接我的DLL与应用程序链接的CRT?或许是清单上的东西?更一般地说,我的问题是如何构建一个表现良好的dll,客户可以使用它们构建自己的应用程序?

编辑:感谢答案中的建议,我已将所有对std类的引用转移到我的头文件中的内联函数,并将我的dll与静态运行时库相关联.现在它甚至可以在与不同CRT版本链接的应用程序中工作.

c++ windows dll

12
推荐指数
2
解决办法
2764
查看次数

是否可以将Clojure的案例表单与Java枚举一起使用?

case医生说

与cond和condp不同,case执行常量时间调度......所有常量表达式都是可以接受的.

我想从caseJava枚举上的常量时间调度中获益.Java的switch声明适用于枚举,但在Clojure中执行以下操作:

(defn foo [x] 
   (case x 
      java.util.concurrent.TimeUnit/MILLISECONDS "yes!"))

(foo java.util.concurrent.TimeUnit/MILLISECONDS)
Run Code Online (Sandbox Code Playgroud)

结果是: IllegalArgumentException No matching clause: MILLISECONDS

枚举是否不受支持case?难道我做错了什么?我必须诉诸cond或有更好的解决方案吗?

clojure clojure-java-interop

10
推荐指数
2
解决办法
1027
查看次数

如何标记Clojure函数以便我可以使用Java反射识别它

我需要以某种方式将某些Clojure函数标记为"特殊",以便Java代码可以使用反射识别它们.我试图在函数中添加注释,但显然不支持.我试图reify扩展接口IFn(以便Java代码可以识别函数对象),但这并不好,因为Clojure不直接使用reified方法作为代码实现invoke,而是间接调用Afunction实际的对象实现该方法(我需要invoke用实际的功能代码标记实际的方法).

有任何想法吗?

编辑:甚至以可以使用ASM库(而不是常规反射)访问的方式进行标记也没问题,但我需要以某种方式标记实际AFunction对象或invoke方法.此外,我无法访问实际AFunction对象 - 我需要标记在类上可见.

clojure clojure-java-interop

8
推荐指数
1
解决办法
234
查看次数

为什么从Leiningen运行时,任何Java/Clojure程序都会放慢速度?

在对Clojure应用程序进行基准测试并尝试确定性能问题时,我注意到了这种奇特的行为:即使整个程序是用Java编写的,当从Leiningen启动时,它似乎也经历了显着的减速.

说我有这个Java程序:

public class Foo {
    public static void main(String[] args) throws Exception {
        for (int i = 0; i < 10; i++)
             run();
    }

    public static void run() {
        final long start = System.nanoTime();

        Random r = new Random();
        double x = 0;
        for(int i=0; i<50000000; i++)
            x += r.nextDouble();

        final long time = TimeUnit.MILLISECONDS.convert(System.nanoTime() - start, TimeUnit.NANOSECONDS);
        System.out.println("time (ms): " + time + " total: " + x);
    }
}
Run Code Online (Sandbox Code Playgroud)

当我只运行程序时,我的执行时间(每个run)约为1秒.但是,当我从leiningen那样运行它时:

lein run -m Foo
Run Code Online (Sandbox Code Playgroud)

我得到大约 …

clojure leiningen

6
推荐指数
1
解决办法
459
查看次数

为什么在Visual C++ 2008中链接静态运行时库仍然需要在运行时使用MSVCR71.dll?

我正在构建一个静态链接c运行时库的DLL .为什么它在运行时需要MSVCR71.dll?

c++ windows visual-c++

4
推荐指数
1
解决办法
709
查看次数

如何拒绝Netty中的传入连接?

我有一个Netty TCP服务器,我想有选择地拒绝/拒绝传入连接尝试(基于他们的远程地址).我想我必须使用ServerBootstrap.setParentHandler(ChannelHandler),但我该怎么做ChannelHandler?我处理什么事?我该如何拒绝连接?

java netty

2
推荐指数
1
解决办法
4692
查看次数